Как распространить изменение размера подпредставления на изменение размера суперпредставления?

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

В частности, у меня есть представление прокрутки, в котором есть подпредставление в виде контейнера, содержащего таблицу, и другое представление, которое, в свою очередь, содержит изображение и другую таблицу. Вот так:

введите здесь описание изображения

А это цепочка событий:

A)

1 Самая внутренняя таблица из 2 строк может быть растянута, если имя человека слишком длинное (это означает, что высота ячеек является переменной и рассчитывается во время выполнения на heightForCellAtIndexPath).

2 Если это так, это должно инициировать растяжение представления контейнера для этой таблицы и изображения, чтобы никакие ячейки таблицы не переполняли представление.

3 И если это так, то другую таблицу под этим представлением контейнера нужно немного перевести вниз, чтобы убедиться, что она не перекрывается. Обратите внимание, что цепочка также может начинаться здесь, даже если шаги 1, 2 не выполняются. Это будет иметь место, если какие-либо 3 строки этой таблицы будут растягиваться, чтобы вместить более длинный текст.

4 Если что-то из вышеперечисленного приводит к увеличению длины, самое внешнее представление контейнера также должно растягиваться по длине.

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

Первая проблема заключается в знании того, когда (в какой точке кода) самая внутренняя таблица завершает размещение своих ячеек и вычисляет ее окончательный кадр. Если бы я знал, когда известен последний кадр, я мог бы отправить уведомление KVO об изменении view.frame на единственный контроллер представления, управляющий всеми этими представлениями. Но тогда контроллеру пришлось бы вручную изменять размеры всех кадров подвидов. Я пробовал этот подход, но кадры не кажутся точными. Мне интересно, могут ли быть проблемы со временем, которые я не рассматриваю.

Это работает, например:

- (void)viewDidLoad
{
  ...

  [self addObserver:self forKeyPath:@"attendeeContentView.frame" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:NULL];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{
  if([keyPath isEqualToString:@"attendeeContentView.frame"]) 
  {
    CGRect newFrame = [[change objectForKey:NSKeyValueChangeOldKey] CGRectValue];
    UIScrollView *scrollView = (UIScrollView*)self.view;
    scrollView.contentSize = CGSizeMake([[UIScreen mainScreen] applicationFrame].size.width, newFrame.size.height + newFrame.origin.y);
    NSLog(@"\n new contentSize: %f", newFrame.size.height + newFrame.origin.y);
  }
}

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

Есть идеи?


person SaldaVonSchwartz    schedule 10.11.2011    source источник
comment
Что ты в итоге сделал?   -  person huggie    schedule 17.01.2013


Ответы (1)


Вы можете просто проверить последний вызов - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

if (indexPath.row == (NumberOfCells - 1)) {
        // update your views (preferably call it after a slight delay)
}
person Mustafa Ahmed    schedule 18.04.2013