动态更改由自动布局控制的视图的纵横比
Dynamically change aspect ratio of view controlled by autolayout
问题
在 UI 中,我有一些观点认为哪些内容是可拉伸的,但应该保留一些纵横比。此纵横比在 运行 期间发生变化,并且当某些 属性 描述纵横比发生变化时应更新视图布局。
我已经暴露了NSLayoutConstraint
,但是它的属性用于宽高比:multiplier
是只读的。比较搞笑的是相似属性constant
可以改
可能的解决方案
- 我可以只使用固定宽度或高度的约束并根据预期比率计算它,但这需要额外的样板代码,这些代码将对 geometry/layout 更改做出反应,我宁愿避免这种情况。
- 我可以尝试使用
intrisicContentSize
和 sizeThatFits:
,但我不确定如何将其与 NSLayoutConstraint
一起使用
好吧,我抱怨太多了。删除和重新创建约束并不是什么大问题(感谢@vacawama):
- (void)updateASpectRatio: (float)aspectRatio {
// self.aspectRatioConstraint - has to be a strong reference
[self.aspectRatioView removeConstraint: self.aspectRatioConstraint];
self.aspectRatioConstraint = [NSLayoutConstraint constraintWithItem: self.aspectRatioConstraint.firstItem
attribute: self.aspectRatioConstraint.firstAttribute
relatedBy: self.aspectRatioConstraint.relation
toItem: self.aspectRatioConstraint.secondItem
attribute: self.aspectRatioConstraint.secondAttribute
multiplier: self.aspectRatioView.aspectRatio
constant: 0.0];
[self.aspectRatioView addConstraint: self.aspectRatioConstraint];
}
问题
在 UI 中,我有一些观点认为哪些内容是可拉伸的,但应该保留一些纵横比。此纵横比在 运行 期间发生变化,并且当某些 属性 描述纵横比发生变化时应更新视图布局。
我已经暴露了NSLayoutConstraint
,但是它的属性用于宽高比:multiplier
是只读的。比较搞笑的是相似属性constant
可以改
可能的解决方案
- 我可以只使用固定宽度或高度的约束并根据预期比率计算它,但这需要额外的样板代码,这些代码将对 geometry/layout 更改做出反应,我宁愿避免这种情况。
- 我可以尝试使用
intrisicContentSize
和sizeThatFits:
,但我不确定如何将其与NSLayoutConstraint
一起使用
好吧,我抱怨太多了。删除和重新创建约束并不是什么大问题(感谢@vacawama):
- (void)updateASpectRatio: (float)aspectRatio {
// self.aspectRatioConstraint - has to be a strong reference
[self.aspectRatioView removeConstraint: self.aspectRatioConstraint];
self.aspectRatioConstraint = [NSLayoutConstraint constraintWithItem: self.aspectRatioConstraint.firstItem
attribute: self.aspectRatioConstraint.firstAttribute
relatedBy: self.aspectRatioConstraint.relation
toItem: self.aspectRatioConstraint.secondItem
attribute: self.aspectRatioConstraint.secondAttribute
multiplier: self.aspectRatioView.aspectRatio
constant: 0.0];
[self.aspectRatioView addConstraint: self.aspectRatioConstraint];
}