2012-02-12 3 views
4

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

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

ответ

-3

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

IBOutlet UIView *customView; 

Присвоить customView с этой точки зрения в вашем XIb.

-(UIView *)viewOfCategory; 

В .m:

-(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. 
    } 
+0

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

2

Это поможет вам read up на просмотр 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, согласно тому же источнику документации, «изменяет размеры и перемещает вид приемника, поэтому он просто закрывает свои подсмотры». Кажется нецелесообразным вызывать это сразу после создания представления и перед помещением его в заголовок таблицы.

+0

Привет, Мунди, спасибо, что указал мне в правильном направлении. Я уже знаком с авторезистированием масок и установкой маски авторезистирования headerView, чтобы None не исправил это. Я все еще смущен тем, почему моя авторезистирующая маска (flexibleRightMargin и flexibleBottomMargin) вызвала такое поведение. Почему таблица должна попытаться изменить размер рамки сразу после установки headerView? Кроме того, почему при настройке маски авторезистора ни один из них не отображался правильно после поворота (его рамка была изменена, чтобы соответствовать ширине таблицы). Есть идеи? –

+0

Собственно, скраб это. Установив его на None, он исправил его, но это не так. Он останавливает эти дополнительные вызовы to_resizeWithOldSuperViewSize, и ширина представления правильно задана, но высота больше не изменяется. Мне нужно провести дополнительное тестирование. –

+0

Удалось ли вам это исправить? – Mundi

1

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

Итак, я решил применить действительно грязный взломать, переустанавливая высоту кадра в переопределенном наборе кадров вашего пользовательского UIView (там вы регистрируете размер кадра), чтобы что-то вам нужно (в вашем случае это 120).

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

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

P.S. BTW Я использую Auto Layout внутри своего пользовательского UIView.

+0

Черт, я чуть не потерял оставшиеся волосы на этом. Обычно я не пишу «спасибо», но это очень заслуженно. –

3

Вам необходимо получить собственный размер и авторезистировать Маскировку. Как только вы это сделаете, UITableView перестанет завинчиваться с помощью tableHeaderView.

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

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

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

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

tableView.tableHeaderView = headerView 
+0

Wau настолько глупый баг ... И я уже исправлял его с помощью просмотраWillTransitionToSize взлома ... Просто отключить автосортировку для высоты достаточно. – Renetik

 Смежные вопросы

  • Нет связанных вопросов^_^