Как я могу распространить изменение размера подвид на изменение размера суперпредставления? - PullRequest
3 голосов
/ 10 ноября 2011

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

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

enter image description here

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

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);
  }
}

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

Есть идеи?

1 Ответ

0 голосов
/ 18 апреля 2013

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

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