Неправильно отображается перезагрузка после поворота

У меня проблема с перезагрузкой пользовательского UIView (SBBarChart) внутри ячейки таблицы. Я не использую авторазметку, потому что было слишком сложно настроить все компоненты ячейки, которые могут быть там или нет. Я каждый раз вручную вычисляю прямоугольники, и это работает.

Что касается поворота, я попытался реализовать в контроллере табличного представления метод willRotateToInterfaceOrientation с [self.tableView reloadData] внутри. Это генерирует ячейки снова после вращения. Отлично.

Внутри класса ячеек я вызываю [self.barChart setNeedsDisplay], чтобы убедиться, что подпредставления диаграммы будут перезагружены, что работает.

Теперь проблема. Изначально портретный вид открывается и загружается корректно. Когда я поворачиваюсь в ландшафт, это тоже работает. Когда я возвращаюсь к портретной ориентации, длина полосы рассчитывается правильно, но все равно отображается так же, как и в альбомной ориентации. Таким образом, новый прямоугольник для полосы имеет правильные размеры, но полоса отображается слишком долго и частично за пределами экрана.

Метка с теми же размерами для фрейма отображается (и центрируется) правильно, поэтому это должно быть проблемой перезагрузки панели.

Что я делаю не так?


person Antiohia    schedule 25.04.2013    source источник


Ответы (2)


Попробуйте проверить [[UIApplication sharedApplication] statusBarOrientation]

при перезагрузке таблицы, затем отрегулируйте ее соответствующим образом. Это даст текущий статус ротации.

person Mark McCorkle    schedule 25.04.2013
comment
Спасибо за ответ, но я хочу заполнить ширину экрана гистограммой. Таким образом, код диаграммы — self.barChart.frame = CGRectMake(20, self.barChart.frame.origin.y, self.frame.size.width - 60, self.barChart.frame.size.height);. Расчет работает нормально, но прямоугольник остается слишком длинным. Пробовал [self.barChart setNeedsDisplayInRect:self.barChart.frame]; не помогает. Для метки я делаю self.myLabel.frame = CGRectMake(self.barChart.frame.origin.x, self.barChart.frame.origin.y, self.barChart.frame.size.width, self.barChart.frame.size.height);, и это работает. - person Antiohia; 26.04.2013

Я только что решил свою проблему. Я нашел три основные ошибки в своем коде.

1) Я использовал dequeueReusableCellWithIdentifier после удаления элементов управления из ячеек. Это привело к отсутствию элементов управления и странному поведению. Теперь я каждый раз генерирую новую ячейку из пера.

2) Я использовал значения x и y элементов управления, которые я удалил из ячейки. Вместо этого я просто поставил числовые значения.

3) Я использовал frame для определения ширины экрана. При этом рамка не меняется. Чтобы решить эту проблему, я использовал следующий поток: Как получить высоту и ширину экрана в зависимости от ориентации?

Теперь мне даже не нужна строка [self.barChart setNeedsDisplay] и я могу вращать устройство сколько угодно, элементы управления больше не смещаются. :)

Я все еще не уверен, что мне нужно вызывать reloadData для настройки макета, но я не нашел лучшего решения.

Итак, наконец-то это работает! Большое спасибо за помощь, и я надеюсь, что этот пост поможет кому-то еще. :)

person Antiohia    schedule 26.04.2013