【问题标题】:Subclassing NSLayoutConstraint in Swift在 Swift 中继承 NSLayoutConstraint
【发布时间】:2018-07-29 16:38:34
【问题描述】:

我想在 Swift 中继承 NSLayoutConstraint 以提供更简单的方法来实例化常见约束(例如 height、width、...)。

到目前为止我写的代码草案不能正常工作,因为item-properties 无法写入:

class TestConstraint: NSLayoutConstraint {
    init(item: Any) {
        super.init()
        self.firstItem = item // WARNING: Cannot assign to property: 'firstItem' is a get-only property

        // ...
    }
}

是否有可能以这种方式继承NSLayoutConstraint 还是我必须另外考虑其他事情?

【问题讨论】:

  • 您尝试过布局锚点吗?这是首选方式。不要子类化它
  • 这样容易多了,谢谢。
  • 如果你真的想要自定义约束,stackoverflow.com/a/46867981/294884

标签: swift inheritance nslayoutconstraint subclassing


【解决方案1】:

我认为你需要的是 UIView 的扩展。

extension UIView{
    func anchor(top:NSLayoutYAxisAnchor?,leading:NSLayoutXAxisAnchor?,trailing:NSLayoutXAxisAnchor?,bottom:NSLayoutYAxisAnchor?,padding:UIEdgeInsets = .zero,size:CGSize = .zero){

        translatesAutoresizingMaskIntoConstraints = false

        if let top = top{
            topAnchor.constraint(equalTo: top, constant: padding.top).isActive = true
        }
        if let leading = leading{
            leadingAnchor.constraint(equalTo: leading, constant: padding.left).isActive = true
        }
        if let trailing = trailing{
            trailingAnchor.constraint(equalTo: trailing, constant: -padding.right).isActive = true
        }
        if let bottom = bottom{
            bottomAnchor.constraint(equalTo: bottom, constant: -padding.bottom).isActive = true
        }
        if size.width != 0{
            widthAnchor.constraint(equalToConstant: size.width).isActive = true
        }
        if size.height != 0{
            heightAnchor.constraint(equalToConstant: size.height).isActive = true
        }
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2015-11-08
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    相关资源
    最近更新 更多