Переопределение layoutSubviews
- правильный способ сделать это. UIKit не имеет встроенного управления макетом, которое может сделать это за вас.
Однако вы можете не осознавать, что UIScrollView
отправляет себе layoutSubviews
каждый раз при прокрутке - в каждом кадре прокрутки. Это может быть намного чаще, чем вам нужно! Вы не хотите выполнять большую работу в UIScrollView
layoutSubviews
, если можете этого избежать.
Чтобы избежать создания дополнительного макета, я предлагаю вам настроить иерархию представлений следующим образом:
UIScrollView
ContainerView with layoutSubviews method
content view 1
content view 2
content view 3
content view 4
content view 5
Используйте стандарт UIScrollView
. Дайте ему одно подпредставление, которое является пользовательским подклассом UIView
(в моем примере я назвал его ContainerView
). ContainerView
имеет пять представлений контента в качестве подпредставлений.
Когда вы назначаете новое содержимое одному из пяти представлений содержимого, отправьте sizeToFit
этому представлению содержимого. Если размер представления изменяется, UIKit должен автоматически отправить layoutSubviews
своему суперпредставлению - ContainerView
. Метод ContainerView
layoutSubviews
корректирует положение своих подпредставлений, чтобы поддерживать отступ между ними, а затем устанавливает contentSize
его родителя - UIScrollView
.
- (void)layoutSubviews {
CGRect myFrame = CGRectZero;
for (UIView *subview in self.subviews) {
CGRect frame = subview.frame;
if (myFrame.size.height > 0) {
frame.origin.y = myBounds.size.height + Padding;
subview.frame = frame;
}
myFrame = CGRectUnion(myFrame, frame);
}
self.frame = myFrame;
UIScrollView *scrollView = self.superview;
scrollView.contentSize = myFrame.size;
}
Таким образом, вы не выполняете никакой дополнительной работы только потому, что прокручивается представление прокрутки. Вы размещаете контент только тогда, когда контент действительно меняется.