约束会影响哪些属性?

时间:2015-07-29 13:29:34

标签: ios swift constraints programmatically-created

我正在努力理解约束的逻辑,有些东西我找不到......

我创建了一个自定义UIButton并添加一些约束来改变它的宽度和高度,并且它工作正常。但我找不到按钮的新宽度和高度值。如何在约束更改后获取这些值?

这是我的代码......

import Foundation
import UIKit

class RoundedButton: UIButton {

    class func make (text:String, color:UIColor) -> RoundedButton {

        let button = self.buttonWithType(UIButtonType.System) as RoundedButton
        button.frame = CGRectMake(0, 0, 150, 40)
        button.layer.cornerRadius = 20
        button.layer.borderColor = color.CGColor
        button.layer.borderWidth = 2

        button.setTitle(text, forState: UIControlState.Normal)
        button.setTitleColor(color, forState: UIControlState.Normal)
        button.titleLabel?.font = UIFont(name: "OpenSans-Semibold", size: 14)
        return button
    }

    func resizeAndPlace(width:CGFloat, height:CGFloat)
    {
        self.setTranslatesAutoresizingMaskIntoConstraints(false)

        let widthCons = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: width)

        let heightCons = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: height)

        self.superview!.addConstraint(widthCons)
        self.superview!.addConstraint(heightCons)

        println(self.frame.width) // 150 and never changes
    }
}

2 个答案:

答案 0 :(得分:3)

您没有看到约束生效的原因是布局尚未发生。如果你打电话:

self.layoutIfNeeded()
设置约束后立即

,然后值将反映在框架中。

答案 1 :(得分:1)

您可以通过几种方法在示例代码中执行此操作。您实际上可以将width中的heightresizeAndPlace变量存储为RoundedButton类中的属性,但更好的解决方案是自行存储约束并执行{{1 }和widthConstraint.constant。然后,当您想要更改约束时,您只需更改heightConstraint.constant而不是删除旧约束并添加新约束。