约束会影响哪些属性?
Which properties do constraints affect?
我正在尝试理解约束的逻辑,但有些东西我找不到...
我创建了一个自定义 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
}
}
您可以通过多种方式在示例代码中执行此操作。您实际上可以将 resizeAndPlace
中的 width
和 height
变量作为属性存储在 RoundedButton
class 中,但更好的解决方案是存储约束本身和做 widthConstraint.constant
和 heightConstraint.constant
。然后当你想改变约束时,你可以只改变 constant
s 而不是删除旧约束并添加新约束。
您没有看到约束生效的原因是布局尚未发生。如果您致电:
self.layoutIfNeeded()
设置约束后,值将立即反映在框架中。
我正在尝试理解约束的逻辑,但有些东西我找不到...
我创建了一个自定义 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
}
}
您可以通过多种方式在示例代码中执行此操作。您实际上可以将 resizeAndPlace
中的 width
和 height
变量作为属性存储在 RoundedButton
class 中,但更好的解决方案是存储约束本身和做 widthConstraint.constant
和 heightConstraint.constant
。然后当你想改变约束时,你可以只改变 constant
s 而不是删除旧约束并添加新约束。
您没有看到约束生效的原因是布局尚未发生。如果您致电:
self.layoutIfNeeded()
设置约束后,值将立即反映在框架中。