当我使用“等宽”约束时如何获取UIView的宽度或高度

时间:2019-08-05 07:36:35

标签: ios swift swift4

我需要帮助解决此问题:我有一个UITextFiled,我正在尝试使用此代码在底部应用边框:

func addBottomBorderWithColor(color: UIColor, width: CGFloat) {
        let border = CALayer()
        border.backgroundColor = color.cgColor
        border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: width)
        self.layer.addSublayer(border)
    }

问题在于结果不正确,边框超出了文本字段的范围,因为在文本字段中,我使用的是“等宽约束”,而设计时的宽度与“ Didload()中的宽度不同” “ 时间。有一种方法可以在“等宽约束”校正后获取textField的宽度?

3 个答案:

答案 0 :(得分:2)

一种更好的方法是

  • 子类UITextField
  • 在初始化时创建“下划线边框”层
  • layoutSubviews()中更改该层的框架

示例:

@IBDesignable
class UnderlinedTextField: UITextField {

    let underlineLayer: CALayer = CALayer()

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

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

    func commonInit() -> Void {
        layer.addSublayer(underlineLayer)
        underlineLayer.backgroundColor = UIColor.black.cgColor
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        underlineLayer.frame = CGRect(x: 0, y: bounds.height - 2.0, width: bounds.width, height: 2)
    }

}

结果(我为文本字段设置了.cyan的背景色,以便于查看)

enter image description here

当字段大小更改时(例如在设备旋转时),它会自动调整“下划线”的大小:

enter image description here

请注意,通过将其设置为@IBDesignable,您还可以在设计时看到下划线层。

此示例为“下划线”使用默认的黑色,但是您可以像其他任何属性更改一样通过代码对其进行更改,例如:

testField.underlineLayer.backgroundColor = UIColor.red.cgColor

答案 1 :(得分:1)

覆盖bounds变量,并在didSet中调用边框图。每当视图更改范围时,您的图层都会更新。

    var border = CALayer()

    init(frame: CGRect) {
        super.init(farme: frame)

        self.layer.addSublayer(border)
    }

    override var bounds: CGRect {
        didSet {
            addBottomBorderWithColor(color: .black, width: 2)
        }
    }

    func addBottomBorderWithColor(color: UIColor, width: CGFloat) {
        border.backgroundColor = color.cgColor
        border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: width)
        self.layer.setNeedsLayout()
    }

答案 2 :(得分:0)

我自己找到了一个可能的解决方案(不是完美的方案)。 因为该约束可能是在DidLoad()之后和viewDidLayoutSubviews()之后应用的,所以我调用了该函数以在函数viewDidAppear()中添加边框。现在,即使以很小的延迟显示新边框也可以使用。

最好的方法是子类化UITextFiled,如此处所述。 Custom class that can be applied to every UITextField - Swift

在这种情况下,正确创建了对象

相关问题