2015-10-20 4 views
1

Я узнаю о контейнерах View Controller и встраивании контроллеров Viev в iOS с использованием быстрой и раскадровки. Проблема - добавленный вид не находится в пределах родительского представления. Вот как он выглядит в построителе интерфейса: Screens Вид слева - это контроллер родительского вида, а белая область - это вид, в котором я хочу разместить синий контроллер вида. Я предполагаю, что контроллер голубых точек должен заполнить этот белый вид. Однако, это то, как он выглядит на IPad: enter image description hereViewController добавлен программно выглядит смещенным/трансляционным (iOS, swift, раскадровки)

Это выглядит, как синий вид помещается на ту же сумму пикселей ниже верхней белой точки зрения, как белый вид на верхней части экрана.

Вот код:

class ViewController: UIViewController { 


@IBOutlet weak var vcContainer: UIView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    var vc = self.storyboard?.instantiateViewControllerWithIdentifier("TestViewController") 
    displayVC(vc!) 

} 

func displayVC(content: UIViewController) { 
    content.view.frame = self.vcContainer.frame 
    content.view.setNeedsLayout() 
    self.vcContainer.addSubview(content.view) 

    self.addChildViewController(content) 

    content.didMoveToParentViewController(self) 

} 

}

Любая помощь будет оценена. Благодаря!

+0

Похоже, вы не добавили ограничений или настроили маску авторезистировки. –

ответ

3

Эта линия: self.vcContainer.addSubview(content.view)

должно быть self.view.addSubview(content.view)

Потому что, когда вы устанавливаете рамки для вашего ребенка ViewController так:

content.view.frame = self.vcContainer.frame

это по отношению к родительскому ViewController, не vcContainer , поэтому после того, как вы добавили content в vcContainer, он находится в неправильном положении.

Если вы хотите добавить content в vcContainer, вы должны выбрать другой способ поместить content.view, что-то вроде пин края content до краев vcContainer с использованием NSLayoutConstraint.

Полный рабочий код:

UIViewController *vc = 
    [self.storyboard instantiateViewControllerWithIdentifier:@"vc"]; 

[self addChildViewController:vc]; 

vc.view.translatesAutoresizingMaskIntoConstraints = NO; 
[self.container addSubview:vc.view]; 
[self.container addConstraint:[NSLayoutConstraint 
            constraintWithItem:vc.view 
              attribute:NSLayoutAttributeTop 
              relatedBy:NSLayoutRelationEqual 
               toItem:self.container 
              attribute:NSLayoutAttributeTop 
              multiplier:1.0 
              constant:0]]; 
[self.container addConstraint:[NSLayoutConstraint 
            constraintWithItem:vc.view 
              attribute:NSLayoutAttributeBottom 
              relatedBy:NSLayoutRelationEqual 
               toItem:self.container 
              attribute:NSLayoutAttributeBottom 
              multiplier:1.0 
              constant:0]]; 
[self.container 
    addConstraint:[NSLayoutConstraint 
         constraintWithItem:vc.view 
           attribute:NSLayoutAttributeLeading 
           relatedBy:NSLayoutRelationEqual 
            toItem:self.container 
           attribute:NSLayoutAttributeLeading 
           multiplier:1.0 
           constant:0]]; 
[self.container 
    addConstraint:[NSLayoutConstraint 
         constraintWithItem:vc.view 
           attribute:NSLayoutAttributeTrailing 
           relatedBy:NSLayoutRelationEqual 
            toItem:self.container 
           attribute:NSLayoutAttributeTrailing 
           multiplier:1.0 
           constant:0]]; 
[vc didMoveToParentViewController:self]; 

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

+0

Это отлично работает. Не могли бы вы также сказать мне, что эквивалентно этому коде в PureLayout? – navarion

+1

С PureLayout, после добавления 'vc.view' в' container', вы можете просто '[vc.view autoPinEdgesToSuperviewEdges]'. Да, это действительно так просто. – kientux

1

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

Это расстояние верно для некоторых устройств, поэтому может показаться, что оно находится посередине, но на ipad это не так.

Вы должны добавить высоту на ваш вид, а не вертикально и горизонтально в центр вашего супервизора.

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