2014-01-20 4 views
-5

Когда я делаю начальную установку UIView «S подвидов, если я инициализацию UIView:Где должен быть установлен код AutoLayout?

//Listing A 
UIView *redBox = [[UIView alloc] init]; 
[redBox setBackgroundColor:[UIColor redColor]]; 
[self.view addSubview:redBox]; 
[redBox setTranslatesAutoresizingMaskIntoConstraints:NO]; 

И я хочу, чтобы программно применить Автокомпоновку ограничение к нему:

//Listing B 
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[redBox(100)]" options:0 metrics:nil views:@{@"redBox": redBox}]; 
[self.view addConstraints:constraints]; 
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[redBox(100)]" options:0 metrics:nil views:@{@"redBox": redBox}]; 
[self.view addConstraints:constraints]; 

Где должен ли лист B идти?

Должно ли оно всегда следовать за листингом A?

Или, если мы в UIView подкласса, она должна идти в:

  • updateConstraints
  • initWithFrame или
  • layoutSubviews?

Точно так же, если мы в UIViewController подклассу, и я помещаю Листинг А в viewDidLoad, должны Листинг B немедленно следовать за ним или он должен идти в:

  • initWithNibName:bundle:
  • viewWillLayoutSubviews или
  • updateViewConstraints?

ответ

-1

viewDidLoad - это лучшее место для применения пользовательского макета, поскольку оно не будет конфликтовать с ограничением xib при инициализации!

+0

Неправильно. Если ограничения, определенные вами в xib, противоречат тем, которые вы определили в 'viewDidLoad', вы получите сообщение об ошибке« Невозможно одновременно удовлетворить ограничения ». – Eric

+6

Опять же, вы задаете вопрос или проверяете знание других? Вы, кажется, знаете лучше, чем люди, пытающиеся помочь вам. – Fogmeister

+0

Невозможно одновременно удовлетворить ограничения ошибки ?? Я действительно не знаю этого термина, если вы знаете, тогда, пожалуйста, объясните лучше, а затем указав, что кто-то ответит отрицательно! – Retro

1

Я часто ставил все это методом (или рядом методов) под названием setUpConstraints или что-то в этом роде.

Затем я называю этот метод от viewDidLoad.

Если вы делаете это в UIView тогда я называю setupConstraints метод из init методов и awakeFromNib.

Сказав, что метод updateViewConstraints уже предоставлен для вас для этой цели, чтобы вы могли позвонить вам setupConstraints.

+0

Где в документах говорится, что ограничения должны быть установлены в 'awakeFromNib' или в' initWithFrame'? Я смущен, потому что [docs] (https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html) говорит: «реализуйте [updateConstraints], если ваше представление необходимо создать пользовательские ограничения между вашими областями ». – Eric

+1

Это не так. Где в документации говорится, где вы должны создать массив для вашей модели данных? Это не так. Существует миллион различных способов решения одной и той же проблемы при программировании. Я просто предоставляю несколько.Мне это не нужно, и теперь я бы этого не хотел. – Fogmeister

+0

Мой вопрос не в том, «как вы, ребята, используете автоматический макет». Apple предоставляет [Просмотреть руководство по программированию] (http://bit.ly/1aEbOez), [Руководство по программированию контроллера просмотра] (http://bit.ly/1eMPoKo) и видео WWDC по этому вопросу. Итак, хотя существует миллион различных способов решения проблемы в программировании, некоторые из них правы, а другие ошибочны. Вот почему я попросил вас обосновать свой ответ. Вот почему вы не должны публиковать ответ, если не можете или не хотите его оправдывать. – Eric

Смежные вопросы