我将我的问题简化为就像ViewController上的UIView一样,如下图所示:
我将纵横比约束从情节提要板拖到ViewController代码中,并命名为aspectRatioConstraint
。
我希望运行应用程序时紫色视图的宽高比为1:1,因此在viewDidLoad中我设置了aspectRatioConstraint.constant = 1
(在运行宽高比之前为343:128)
但是当我运行应用程序时什么也没发生。宽高比未更改为1:1,这是怎么了?
答案 0 :(得分:1)
由于multiplayer
是仅获取属性,因此我们无法更改其值,而可以更改constant
属性。
open var multiplier: CGFloat { get }
从约束菜单中:
第一项=(乘数*第二项)+常量
View.Height =((128/343)* View.Width)+ 0
换句话说,343 = (0.373 * 128) + x
由于乘数必须从0.373更改为1
(View.Height - constant) / View.width = Multiplier
(343-x)/ 128 = 1
x = 343-128
x = 215
aspectRatioConstraint.constant = 215
yourView.layoutIfNeeded()
答案 1 :(得分:1)
如前所述,长宽比实际上是约束的Multiplier
...,这是一个“仅获取”属性。
您可以使用NSLayoutConstraint
扩展名来更改乘数(在此处找到:https://stackoverflow.com/a/33003217/6257435):
extension NSLayoutConstraint {
/**
Change multiplier constraint
- parameter multiplier: CGFloat
- returns: NSLayoutConstraint
*/
func setMultiplier(multiplier:CGFloat) -> NSLayoutConstraint {
NSLayoutConstraint.deactivate([self])
let newConstraint = NSLayoutConstraint(
item: firstItem,
attribute: firstAttribute,
relatedBy: relation,
toItem: secondItem,
attribute: secondAttribute,
multiplier: multiplier,
constant: constant)
newConstraint.priority = priority
newConstraint.shouldBeArchived = self.shouldBeArchived
newConstraint.identifier = self.identifier
NSLayoutConstraint.activate([newConstraint])
return newConstraint
}
}
现在,您可以在viewDidLoad()
中致电:
aspectRatioConstraint = aspectRatioConstraint.setMultiplier(multiplier: 1.0)
答案 2 :(得分:0)
需要在更改视图约束常量之前和之后集成self.view.layoutIfNeeded()。