【问题标题】:UITextField border with AutoLayout is flickering带有 AutoLayout 的 UITextField 边框闪烁
【发布时间】:2017-06-15 11:44:39
【问题描述】:

我正在设计一个像表单一样的屏幕,使用 AutoLayout 包含很少的UITextFields。我只想在UITextFields 的底部设置边框。我使用CALayer 设置了边框。但是UITextField 在方法viewDidAppear 中占据了它的高度(在应用自动布局之后),因此在viewDidAppear 中为UITextField 添加边框使其看起来好像在闪烁。那么有没有其他方法可以在底部使用 AutoLayout 将边框设置为 UITextFeild

【问题讨论】:

  • 您是否尝试过在 UITextField 底部使用简单的 UIView ?我的意思是把高度的 UIView 说成 1px,然后对其应用约束,以便它始终附加到 UITextField 的底部。
  • 谢谢,我们可以使用 UITextFeild 底部的 UIView 作为边框,但我必须在 textFieldDidBeginEditing 和 textFieldDidEndEditing 之间切换边框颜色,因此我使用的是 CALayer。
  • 你不能用这些方法改变 UIView 的颜色吗???
  • 是的,它可以使用 UIView,我们可以改变它的颜色,它只会增加 Swift 文件中 IBOutlets 的数量。
  • 如果您不想增加网点数量,请以编程方式应用 CALayer。无论如何,您必须获得所需的输出。现在这取决于您要应用哪种策略。

标签: ios iphone ipad autolayout


【解决方案1】:
class CustomTextField: UITextField {

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    self.commonInit()
}

override init(frame: CGRect) {
    super.init(frame: frame)
    self.commonInit()
}

func commonInit() {
    self.borderStyle = .none //To remove default border.

    let bottomBorder = UIView()
    bottomBorder.frame.size = CGSize(width: self.frame.size.width, height: 1)
    bottomBorder.frame.origin = CGPoint(x: 0, y: self.frame.size.height - 1)
    bottomBorder.backgroundColor = UIColor.lightGray
    bottomBorder.autoresizingMask = [.flexibleWidth, .flexibleTopMargin]
    self.addSubview(bottomBorder)
}

}

最后我通过使用 AutoLayout 创建 CustomUITextField 来实现它。只需将上述类应用于界面生成器中的 UITextField 即可。

【讨论】:

    【解决方案2】:

    如果我理解你的话,你所要做的就是在上面的方法中调用“绘制边框”方法而不是viewDidAppear。我想它可以解决你的问题。

    override func viewDidLayoutSubviews() {
        //A UIViewController's overrode method
        //call you method here
    }
    

    在视图出现之前和子视图布局之后调用此方法。例如,当你在工作时——我的意思是改变——层,你应该总是使用它而不是viewDidLoad

    希望对你有帮助:)

    【讨论】:

      【解决方案3】:

      步骤 - 选择文本字段 -> 显示属性检查器右侧面板并选择虚线边框样式。 接下来将 uilabel 拖到场景中,并将其设置为 1.0 和所需的宽度,保留文本字段的底部。这样你的问题就解决了。这可能会对您有所帮助。

      【讨论】:

      • 这种情况下,使用高度为1.0的UILabel/UIView作为边框是唯一的选择。
      【解决方案4】:

      如果您使用模拟器进行测试。它看起来像在闪烁,但实际上不是。

      如果您将模拟器缩放到 25%。 1px 的线出现并且 滚动时消失,因为您拥有的屏幕分辨率是 小于实际设备分辨率。

      在将模拟器缩放到 100% 时对其进行测试。 cmd+1

      【讨论】:

      • 实际上它在模拟器和实际设备上都在闪烁。这是因为自动布局完全应用于方法 viewDidAppear 中的 UITextField。在 viewDidLayoutSubviews 中设置边框并不是最佳做法。
      猜你喜欢
      • 2014-04-30
      • 2016-11-06
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多