有什么办法选择永久退出自动调整大小?

时间:2019-03-18 00:21:16

标签: swift autolayout nsview autoresizingmask

我正在编写无笔尖的视图,其中所有布局逻辑都使用自动布局。我发现自己必须在实例化的每个视图中关闭自动调整大小功能。我的代码杂乱无章:

calc()

理想情况下,我只是想

calc(var(--grid-item-width) * 1.6)

并一劳永逸地解决它,但是扩展不能覆盖存储的属性。

还有其他简单的方法可以永久关闭自动调整大小吗?

1 个答案:

答案 0 :(得分:1)

这只是一个建议,因为它总是烦人,总是将其设置为false,只需为UIView的所有共享设置设置一个函数,然后每次都调用它, 节省时间,并且比每次尝试设置值都要麻烦,

extension UIView {
func notTranslated() {
self.translatesAutoresizingMaskIntoConstraints = false
//Add any  additional code. 
    }
}
//Usage
let view = UIView()
view.notTranslated()

您不能override约束属性,因为UIView可能在IB

中声明了

根据apple将AutoresizingMaskIntoConstraints 转换。

  

默认情况下,以编程方式创建的任何视图的属性都设置为true。如果在Interface Builder中添加视图,则系统会自动将此属性设置为false。

想象一下,如果您可以overrideextension,而如果存在其他UIView却具有相反值True || false,则会导致一些冲突,因此我的意见

  

Apple这样做是为了防止与视图约束发生任何冲突,因此,如果您不想每次编写它,只需将其包装在一个函数中即可。

如果有人有其他信息,请不要犹豫。

更新:我找到了this很酷的答案,该答案也可能有用,请查看下面的代码。

class MyNibless: UIView {
    //-----------------------------------------------------------------------------------------------------
    //Constructors, Initializers, and UIView lifecycle
    //-----------------------------------------------------------------------------------------------------
    override init(frame: CGRect) {
        super.init(frame: frame)
        didLoad()
    }

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

    convenience init() {
        self.init(frame: CGRect.zero)
    }

    func didLoad() {
        //Place your initialization code here

        //I actually create & place constraints in here, instead of in
        //updateConstraints
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        //Custom manually positioning layout goes here (auto-layout pass has already run first pass)
    }

    override func updateConstraints() {
        super.updateConstraints()

        //Disable this if you are adding constraints manually
        //or you're going to have a 'bad time'
        //self.translatesAutoresizingMaskIntoConstraints = false
        translatesAutoresizingMaskIntoConstraints = false
        //Add custom constraint code here
    }
}
var nibless: UIView = MyNibless()
//Usage
nibless.updateConstraints()
print(nibless.translatesAutoresizingMaskIntoConstraints) //false

因此只需将MyNibless实例创建为UIView,这也为自定义打开了很大的大门