Xcode - viewDidLayoutSubviews

时间:2014-09-29 15:38:35

标签: xcode view viewdidlayoutsubviews

我在viewController中有一个视图,我想在左边的viewController外面启动较小的视图,当我按下按钮时将它设置为动画。所以我这样做了:

override func viewDidLayoutSubviews() {

    smallView.center = CGPointMake(smallView.center.x - 400, smallView.center.y)

}

它工作得很完美!问题是我在较小的视图里面有一个文本视图,每次我开始编辑它就跳到主视图控制器的正确位置,我必须再次按下按钮把它带进去。 如何解决这个问题?

PS:当我开始编辑文本视图时,我尝试将它定位到中心:

func textViewDidBeginEditing(textView: UITextView) {

    smallView.center = CGPointMake(smallView.center.x + 400, smallView.center.y)

}

但它不起作用。并且该方法正确连接到textView(委托)

PS2:我的viewController中也有imagePickerController。

1 个答案:

答案 0 :(得分:0)

好的,因为您正在使用自动布局。

自动布局的第一条规则(您将在任何自动布局书中看到这一点)是您绝对无法直接触摸视图的framecenter

// don't do these
myView.frame = CGRectMake(0, 0, 100, 100);

// ever
myView.center = CGPointMake(50, 50);

你可以获得框架和中心,但你永远不能设置框架或中心。

为了使用自动布局移动内容,您需要更新约束。

例如,如果我设置一个名为myView的视图并希望它在高度上增长和缩小,我会做类似的事情......

  1. 将顶部约束设置为超级视图为0。
  2. 将左侧约束设置为超级视图为0。
  3. 将权限约束设置为0的超级视图。
  4. 将高度约束设置为50(例如)并将其保存在名为heightConstraint的属性中。
  5. 现在为高度变化设置动画我这样做......

    self.heightConstraint.constant = 100;
    
    [UIView animateWithDuration:1.0
                     animations:^ {
                         [self.view layoutIfNeeded];
                     }];
    

    然后,这将使高度从50(我设置时的位置)设置为100。

    对于使用自动布局的任何视图动画,这都是相同的。如果(例如)我保存了左边约束,我可以改变它,它会增加和减少从超视图左边缘到myView的间隙。

    Ray Wenderlich site上有几个关于AutoLayout的非常好的教程。我建议你看看它们。

    无论你做什么,我强烈建议不要只禁用自动布局。如果您不知道如何使用自动布局,那么您将很快落后于iOS 8和新设备尺寸。