【问题标题】:getting highly confused by odd behaviour of viewController Method被 viewController 方法的奇怪行为搞糊涂了
【发布时间】:2017-01-16 00:43:59
【问题描述】:

我已经将一个方法重写为

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 被无限次调用,我的应用程序变得无响应。我通过使用布尔变量解决了这个问题。但我不明白为什么会这样。有人可以向我解释一下吗?

谢谢:-)

【问题讨论】:

    标签: ios objective-c swift viewdidlayoutsubviews


    【解决方案1】:

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

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

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

    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    
    }
    

    【讨论】:

    • 实际上问题已经解决了,但我不明白为什么应用程序不会卡在 iphone 6 和 6+ 为什么只在 iphone 5 上?
    • 我认为 iOS 版本和设备内存限制之间的差异
    • @UmairAfzal 你的问题没有解决。您正在使用一种非常糟糕的做法来解决此问题,阻止该方法运行绝不是正确的选择。 viewDidLayoutSubviews 用于定位视图,而不是创建和添加它们。请按照上面的建议将此代码移至 viewDidLoad。否则每次都会遇到这个问题
    【解决方案2】:

    只需替换

    emailTextField.layer.addSublayer(border)
    

    用这个:

    emailTextField.addSublayer(border)
    

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

    【讨论】:

      【解决方案3】:

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

      override func viewDidLayoutSubviews() 
      {
       //Your CODE    
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-31
        • 1970-01-01
        • 2015-12-28
        • 1970-01-01
        • 2022-01-23
        • 2019-01-12
        • 1970-01-01
        相关资源
        最近更新 更多