2016-03-18 4 views
3

Вот что я хочу сделать: Моя раскадровка содержит UIViewController с несколькими контрольными элементами. Высота меньше половины экрана. Для простоты назовем его DataViewController. DataViewController встроен в другие UIViewControllers через «Container View».Как определить размер и положение встроенного UIViewController с использованием ограничений автоматического макета?

Хотя «Container View» отображает DataViewController, он все еще должен иметь явный набор height. В противном случае строитель интерфейсов жалуется на неоднозначные ограничения.

Теперь, как я могу сказать «Container View», что размер должен соответствовать требованиям DataViewController? То есть без установки жестко закодированного, явного height в Interface Builder (который, я боюсь, сломал бы макет, если размер шрифта изменится)?

или другими словами: Как вы занимаетесь по размеру/положению UIViewControllers в интерфейсе Builder?

ответ

5

Если вы хотите childViewContainer нести ответственность за его ширины и высоты, вот способ сделать это:

  • ширина Установить и высота ограничения в вашем Родитель View Controller (s) и выберите удалить в время сборки. Они просто здесь, поэтому разработчик интерфейса перестает жаловаться на недостающие ограничения.

  • (Вы можете) Модифицированный размер контроллера детского просмотра с фиксированной до свободной формы на вкладке инспектора размера раскадровки.

enter image description here

  • Вот трюк: В вашем Родителе View Controller (s) viewDidLoad отключить translatesAutoresizingMaskIntoConstraints на первые подвиды, и просто переопределить сам это containerView ограничение на ее подвид - корень вид ваш Ребенок View Controller - как ниже:

Objective-C

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.containerView.subviews[0].translatesAutoresizingMaskIntoConstraints = NO; 
} 

#pragma mark - Constraints 

- (void)updateViewConstraints { 
    [super updateViewConstraints]; 
    [self initConstraints]; 
} 

- (void)initConstraints { 
    if (!self.didSetConstraints) { 
     self.didSetConstraints = YES; 

     self.containerView.subviews[0].translatesAutoresizingMaskIntoConstraints = NO; 

     NSDictionary *views = @{@"subview" : self.containerView.subviews[0]}; 

     [self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[subview]|" options:0 metrics:nil views:views]]; 
     [self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subview]|" options:0 metrics:nil views:views]]; 
    } 
} 

Swift

override func viewDidLoad() { 
    super.viewDidLoad() 
    containerView.subviews[0].translatesAutoresizingMaskIntoConstraints = false 
} 

// Mark: Constraints 

override func updateViewConstraints() { 
    super.updateViewConstraints() 
    initConstraints() 
} 

func initConstraints() { 
    if !didSetConstraints { 
     didSetConstraints = true 

     containerView.subviews[0].translatesAutoresizingMaskIntoConstraints = false 

     let views = ["subview": containerView.subviews[0]] 

     containerView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[subview]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views)) 
     containerView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[subview]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views)) 
    } 
} 

Теперь ваш ребенок View Controller (сопряженный с точки зрения контейнера) полностью отвечает за его размер содержимого. Таким образом, у вас должно быть установлено ограничений, позволяющих корневому представлению рассчитывать его размер, чтобы удовлетворять ограничениям, которые он имеет.

+0

Спасибо, что поделились этим! В конце я решил просто скопировать элементы управления, где они нужны, а не (делать это правильно), просто группируя их в представлении и повторно используя это представление. Это просто слишком сложно, чтобы подход вложенного представления работал правильно, и я действительно не хочу внедрять диспетчер компоновки с явными дерьмовыми (crapples) ограничениями макета. О человек, это так застряло в 90-х ... Во всяком случае, спасибо, что нашли время поделиться этим! Я собираюсь принять это как ответ. –

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