У меня есть собственный UIView, который я установил для свойства tableHeaderView UITableView во время loadView:
headerView = [[MYViewClass alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 120)];
[headerView sizeToFit];
self.tableView.tableHeaderView = headerView;
Вид отображается неправильно, частично изображения обрезаны, а над столом - пустое пространство. При повороте устройства вид практически пропадает. При повороте назад вид теперь больше, чем пространство для заголовка, и закрывает некоторые ячейки в таблице.
Для устранения неполадок я переопределил метод setFrame в своем пользовательском классе представления:
- (void) setFrame:(CGRect)frame {
[super setFrame:frame];
NSLog(@"%@ - %@", NSStringFromSelector(_cmd), NSStringFromCGRect(frame));
}
Я также поставил точку останова в операторе NSLog, чтобы я мог видеть то, что называется setFrame, и получил некоторые странные результаты, которые я не могу объяснить и надеюсь, что кто-то сможет пролить свет на то, что происходит и почему.
Во время loadView
1. initWithFrame calls: setFrame: - {{0, 0}, {320, 120}}
2. sizeToFit calls: setFrame: - {{0, 0}, {320, 109}}
3. setTableHeaderView calls: setFrame: - {{0, 0}, {320, 109}}
4. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {320, 109}}
5. _resizeWithOldSuperviewSize calls: setFrame: - {{0, 0}, {320, 65}}
6. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {320, 65}}
7. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {320, 65}}
Поворот устройства влево
1. _resizeWithOldSuperviewSize calls: setFrame: - {{0, 0}, {480, 0}}
2. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {480, 0}}
3. _resizeWithOldSuperviewSize calls: setFrame: - {{0, 0}, {480, 12}}
4. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {480, 12}}
Поворот устройства вправо
1. _resizeWithOldSuperviewSize calls: setFrame: - {{0, 0}, {320, 172}}
2. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {320, 172}}
3. _resizeWithOldSuperviewSize calls: setFrame: - {{0, 0}, {320, 160}}
4. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {320, 160}}
Это объясняет, почему мой вид сначала выглядит усеченным, затем почти исчезает и, наконец, перекрывает ячейки. Похоже, что _resizeWithOldSuperviewSize
является виновником, и я не понимаю, почему он вызывается и откуда он получает эти странные значения.
Я вызвал [self.tableView.tableHeaderView sizeToFit]
в viewDidAppear:
и didRotateFromInterfaceOrientation:
, который возвращает фрейм к правильному размеру, но перерисовка ужасна, поскольку оба происходят после того, как представление становится видимым или после поворота анимация. Попытка установить это в любое время до того, как представление станет видимым, приводит к тому, что _resizeWithOldSuperViewSize
устанавливает для кадра эти нечетные размеры.