Как сохранить UIView на относительном расстоянии от других после изменения размера? - PullRequest
2 голосов
/ 10 марта 2012

У меня есть пять UIView на UIScrollView.Все они с одинаковой шириной.Каждое представление имеет другие подпредставления, которые изменяют свою высоту в соответствии с назначенным содержимым, что делает родительский UIView и UIScrollView изменяемым размером также.Я пытаюсь держать 5 UIView отделенными друг от друга на определенном расстоянии от отступов даже после изменения размера.То, что я делаю сейчас, - это устанавливаю положение origin.y и высоту каждого UIView, когда вызывается layoutSubviews.Есть ли более простой способ сделать это?
Я попытался установить их позицию при создании, например: CGRectMake(0, aboveView.frame.origin.y + aboveView.frame.size.height + Padding, width, 0) и установить autoresizingMask в UIViewAutoresizingMaskTopMargin.Надеясь, что когда я позвоню sizeToFit на основной UIView, все UView установят свои позиции относительно вида над ними.

1 Ответ

3 голосов
/ 10 марта 2012

Переопределение 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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...