У меня есть UIScrollView, который содержит несколько подпредставлений с динамическим изменением размера. Я могу отлично изменять размер и компоновку подвидов, но когда я устанавливаю размер содержимого самого представления прокрутки, нижние подпредставления обрезаются. Есть ли какая-то причина, по которой высота размера содержимого представления прокрутки должна быть больше, чем сумма высот содержащихся в нем представлений?
Вот моя ситуация более подробно: у меня есть суперпредставление, содержащее UIScrollView, содержащее несколько подпредставлений. В методе layoutSubviews суперпредставления я рассчитал необходимый размер каждого подпредставления, затем установил фреймы так, чтобы подпредставления располагались вертикально вниз по экрану с небольшим пространством между ними. Когда закончите, я устанавливаю высоту размера содержимого 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?
}