2012-02-26 3 views
1

У меня есть UIScrollView, который содержит несколько динамически изменяющихся подзонов. Я могу изменять размер и компоновку подвью только в порядке, но когда я устанавливаю размер содержимого самого представления прокрутки, нижние подзоны обрезаются. Есть ли причина, по которой высота размера содержимого прокрутки должна быть больше суммы высот отображаемых в ней представлений?UIScrollView размер отсечения содержимого, когда он не должен

Подробнее о моей ситуации: У меня есть супервизор, содержащий UIScrollView, содержащий несколько подзаголовков. В методе layoutSubviews метода superview я вычислил необходимый размер каждого поднабора, а затем установил рамки, чтобы подзоны были черепичными по вертикали вниз по экрану с небольшим промежутком между ними. Когда закончите, я установил высоту содержимого содержимого UIScrollView как конец последнего поднабора (origin.y + size.height). Теоретически это означает, что нижняя часть области содержимого прокрутки должна точно соответствовать нижней части последнего подсмотра.

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

Подразделы все расположены и расположены правильно. Проблема заключается в том, что контент contentSize UIScrollView, по-видимому, должен быть значительно больше, чем сумма высот надзоров (плюс пространство между ними). Это не имеет никакого смысла для меня. Кроме того, размер размера «выключен» варьируется - я повторно использую этот просмотр несколько раз с разными подзонами, и все они отличаются от другой суммы. Поэтому простое добавление константы к высоте представления содержимого не поможет.

Что вызывает неправильное функционирование размера контента (или вычислений по высоте)?

Код:

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    CGFloat width = self.bounds.size.width - [self subviewLeftMargin] - [self subviewRightMargin]; // All subviews have same width as parent view 

    CGFloat x = [self subviewLeftMargin]; // All subviews should start at the far left of the view 
    CGFloat y = [self spaceBetweenSubviews]; // Running tally of the y coordinate for the next view 

    /* Adjust the subviews */ 
    for(UIView *view in self.theVariousSubviews) { 
     /* Resize the view with the desired width, then let it size its height as needed */ 
     view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, width, view.frame.size.height); 
     CGSize newSize = [view sizeThatFits:view.frame.size]; 

     /* Set the origin */ 
     //The subviews are positioned correctly, so this doesn't seem to be a problem 
     view.frame = CGRectMake(x, y, newSize.width, newSize.height); 

     /* Have the view refresh its own layout */ 
     [view setNeedsLayout]; 

     /* Update the y value for the next subview */ 
     y += newSize.height + [self spaceBetweenSubviews]; 
    } 

    /* Resize the scroll view to ensure it fits all of the content */ 
    CGFloat scrollViewHeight = y; 
    self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width, scrollViewHeight); 
    //Content size is set to the same total height of all subviews and spacing, yet it is too small. Why? 
} 

ответ

0

привет, мне кажется, что ваш расчет и изменение размеров времени является неправильным. Без недостающего кода для изменения макета я не мог полностью понять проблему.

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

Я могу только посоветовать вам отделить вычисления от макетирования и не вызывать методы во время вычисления. Чтобы принести свет в него, вы должны либо сбросить образец приложения с отсутствующим расчетом, либо сами добавить новую инструкцию NSLog, в которой указывается размер начала кадра любого поднабора и contentOffset для scrollview. В моем опыте scrollview работает нормально, поэтому я ожидаю ошибку в вашем коде.