Автоматическая компоновка с использованием initWithFrame?

Если я внедряю AutoLayout программно в iOS, правильно ли использовать метод initWithFrame? Если нет способа инициализировать представление предпочтительного размера?

Ответ 1

Лучше избегать initWithFrame, если у вас нет выбора. С помощью Auto Layout подход заключается в определении двух ограничений, определяющих ширину и высоту. Существуют разные способы сделать это, но если вы делаете это программно, в методе updateViewConstraints вашего контроллера представления или методе updateConstraints представления, проверьте, были ли уже созданы ограничения, а если нет, добавьте их на ваш взгляд.

например.

[myConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_mySubView]-(200)-|"
                                 options:0
                                 metrics:nil
                                 views:_myViewsDictionary]];

[myConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_mySubView(100)]-|"
                                 options:0
                                 metrics:nil
                                 views:_myViewsDictionary]];

Тем не менее, лучше сделать это с помощью Interface Builder. Как только вы привыкнете к этому - и к нему привыкнуть, вы найдете его фантастическим временным ресурсом и намного лучше, чем определение ваших ограничений в коде.

Ответ 2

Почему не просто: myView = [UIView new];

Это то же самое, что myView = [[UIView alloc] init]; Он будет работать в вашем случае, если после этого в какой-то момент вы добавите требуемые ограничения.

Ответ 3

override init(frame: CGRect) {
    super.init(frame: frame)
    NSBundle.mainBundle().loadNibNamed("YourView", owner: self, options: nil)
    self.containerView.frame = CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame))
    self.addSubview(self.containerView)
}

Это то, что я делаю прямо сейчас. я работаю с немного устаревшим кодом, и иногда для меня требуется много времени для преобразования всех, чтобы использовать автозапуск. Опять же, как указано в @Max MacLeod Не используйте это, если у вас нет выбора.