Свойство высоты tableHeaderView UITableView изменяется на странные значения во время загрузки и вращения - PullRequest
4 голосов
/ 12 февраля 2012

У меня есть пользовательский UIView, который я установил в свойство tableHeaderView UITableView при загрузке:При вращении устройства вид практически исчезает.При повороте назад представление теперь больше, чем пространство для заголовка и скрывает некоторые ячейки в таблице.

Для устранения неполадок я переопределил метод setFrame в моем пользовательском классе представления:

- (void) setFrame:(CGRect)frame {
    [super setFrame:frame];
    NSLog(@"%@ - %@", NSStringFromSelector(_cmd), NSStringFromCGRect(frame));
}

Я также поставил точку останова в операторе NSLog, чтобы увидеть то, что называется setFrame, и получил некоторые странные результаты, которые не могу объяснить, и надеюсь, что кто-то сможет пролить свет на то, что происходит и почему.

Во время загрузки View

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 установить кадр обратно в эти нечетные размеры.

Ответы [ 4 ]

4 голосов
/ 04 июля 2017

Вам необходимо правильно определить размер и авторазмер. Как только вы это сделаете, UITableView перестанет связываться с вашим tableHeaderView.

Например, если вы хотите, чтобы ваш заголовок имел фиксированную высоту, которая зависит от его содержимого, но вы хотите, чтобы ваш заголовок использовал всю ширину таблицы, это то, что вы должны сделать:

1. Создайте свой вид с помощью следующей конфигурации маски с автоматическим изменением размера (чтобы таблица не пыталась увеличить высоту представления заголовка):

enter image description here
2. Добавьте свои подпредставления, используя AutoLayout, чтобы верхний / нижний якоря соответствовали вашему виду (таким образом, ваши подпредставления определяют высоту вашего вида заголовка)
3. Добавьте свой заголовок так:

let headerView : CustomView? = CustomView.fromNib()
headerView?.sizeToFit()

tableView.tableHeaderView = headerView
2 голосов
/ 12 февраля 2012

Это поможет вам прочитать в схеме изменения размера представления Apple с помощью свойства autoresizingMask UIView.Возможные значения:

enum {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
typedef NSUInteger UIViewAutoresizing;

Я не сомневаюсь, что после некоторых экспериментов вы найдете правильную комбинацию маски изменения размера для решения вашей проблемы.

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

1 голос
/ 09 августа 2013

У меня возникла та же проблема, когда я хотел иметь представление заголовка таблицы с SearchBar и некоторым пользовательским интерфейсом внизу. Самое смешное, что если оставить только SearchBar, он будет работать просто идеально.

Поэтому я решил применить очень грязный хак, сбросив значение «Высота фрейма» в переопределенном установщике фреймов вашего пользовательского UIView (там, где вы регистрируете размер фрейма) на то, что вам нужно (в вашем случае это 120).

- (void) setFrame:(CGRect)frame {
    frame.Height = 120;
    [super setFrame:frame];
}

После этого нет странного представления заголовка и таблицы, перекрывающейся при вращении. Надеюсь, это поможет.

P.S. Кстати, я использую Auto Layout внутри моего пользовательского UIView.

0 голосов
/ 12 февраля 2012

Создайте новый xib-файл, а затем настройте предпочитаемый размер в xib-файле. Скажем, xib называется customHeader (.xib). Объявите:

  IBOutlet UIView *customView;

Назначьте customView этому представлению в xib.

  -(UIView *)viewOfCategory;

В .м:

   -(UIView *)viewOfCategory {

if (!customView) {

        [[NSBundle mainBundle] loadNibNamed:@"customHeader" owner:self options:nil];
}

return customView;
   }

Затем вызовите этот метод UITableView:

  -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:        (NSInteger)section {

return [self customView];

}

ТОГДА И НАМНОГО ВАЖНО, ЧТО ОТВЕТИТ НА ВАШ ВОПРОС! Реализуйте этот другой метод UITableView:

   -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {

// You can just return default size of your xib: return [[self viewOfCategory]          bounds].size.height;


       // Or you can return custom size using  CGRect or whatever. 
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...