0

我已经覆盖了一个方法

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、6+ 上运行我的应用程序时,一切正常。iphone5但是,当我在(模拟器 + 真实设备)上运行相同的代码时,viewDidLayoutSubViews会被无限次调用,并且我的应用程序变得无响应。我通过使用布尔变量解决了这个问题。但我不明白为什么会这样。所以有人可以向我解释一下。

谢谢 :-)

4

3 回答 3

2

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

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

将您的代码移动到viewDidLoad方法或loadView如果您不使用xibsStoryboards

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    
}
于 2016-09-08T07:33:57.033 回答
0

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

override func viewDidLayoutSubviews() 
{
 //Your CODE    
}
于 2016-09-08T07:51:40.213 回答
0

只需更换

emailTextField.layer.addSublayer(border)

有了这个:

emailTextField.addSublayer(border)

-> 您想将子层添加到视图中 - 因为您也想对其应用masksToBounds属性。

于 2016-09-08T07:28:59.673 回答