因viewController方法的奇怪行为而高度困惑

时间:2016-09-08 07:25:34

标签: ios objective-c swift viewdidlayoutsubviews

我已经覆盖了一种方法

override func viewDidLayoutSubviews() {

    // creating bottom line for textField
        let border = CALayer()
        let width = CGFloat(1.0)
        border.borderColor = UIColor.whiteColor().CGColor
        border.frame = CGRect(x: 0, y: emailTextField.frame.size.height - width, width:  emailTextField.frame.size.width, height: emailTextField.frame.size.height)

        border.borderWidth = width
        emailTextField.layer.addSublayer(border)
        emailTextField.layer.masksToBounds = true

}

现在发生的事情是,当我在Iphone 6上运行我的应用程序时,每个东西都运行正常。但是当我在iphone5(模拟器+真实设备)上运行相同的代码时,viewDidLayoutSubViews被无限次调用,我的应用程序无响应。我通过使用bool变量解决了这个问题。但我不明白为什么会这样。那么有人可以向我解释一下。

谢谢: - )

3 个答案:

答案 0 :(得分:2)

正如文档所说,viewDidLayoutSubviews方法需要更改布局

  

调用以通知视图控制器其视图刚刚布局   它的子视图。当视图控制器视图的边界发生变化时,   视图调整其子视图的位置,然后调整系统   调用此方法。但是,调用此方法并不表示   视图的子视图的各个布局已经存在   调整。每个子视图都负责调整自己的布局。

如果您未使用viewDidLoadloadView

,请将代码移至xibs方法或移至Storyboards
override func viewDidLoad() {

    // creating bottom line for textField
        let border = CALayer()
        let width = CGFloat(1.0)
        border.borderColor = UIColor.whiteColor().CGColor
        border.frame = CGRect(x: 0, y: emailTextField.frame.size.height - width, width:  emailTextField.frame.size.width, height: emailTextField.frame.size.height)

        border.borderWidth = width
        emailTextField.layer.addSublayer(border)
        emailTextField.layer.masksToBounds = true

}

如果您想更改border.frame,可以将其设置为类变量并在viewDidLayoutSubviews方法中更改

override func viewDidLayoutSubviews() {
      self.border.frame = CGRect(x: 0, y: emailTextField.frame.size.height - width, width:  emailTextField.frame.size.width, height: emailTextField.frame.size.height)
      self.border.borderWidth = width    
}

答案 1 :(得分:0)

只需替换

emailTextField.layer.addSublayer(border)

用这个:

emailTextField.addSublayer(border)

- >您希望将子图层添加到视图中 - 因为您要将masksToBounds属性应用于它。

答案 2 :(得分:0)

在viewDidLayoutSubviews中移动您的实现。我遇到了同样的问题。希望它能奏效。

override func viewDidLayoutSubviews() 
{
 //Your CODE    
}