我有一个按钮,其图像是在运行时动态设置的。因此,为了保持适当的比例,我在设置图像的位置有以下代码:
[super removeConstraint:self.ratioConstraint];
float ratio=photo.size.height/photo.size.width;
self.ratioConstraint=[NSLayoutConstraint constraintWithItem:self.button
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:self.button
attribute:NSLayoutAttributeWidth
multiplier:ratio
constant:0];
[self.ratioConstraint setPriority:UILayoutPriorityDefaultHigh];
[super addConstraint:self.ratioConstraint];
我什至申请了一个[self layoutSubviews]
让我检查框架。当我查询框架时,它是正确的。遵守 1 的比率,并将高度设置为等于宽度。
但是在 ViewWillAppear 中,同样的查询会产生同样不可能的结果:框架的高度被拉伸以让图像增长到它的全高。尽管有上述约束,它应该根据现有的(和尊重的)宽度限制来限制高度。
更令人恼火的是,直到我在运行时将图像设置为新的东西(即通过拍摄相机),约束似乎是有效的——占位符图像被水平压扁,并垂直压缩以适应。只有在我拍完照片时,那个高度才会爆炸,无缘无故地忽略它的约束。
如果重要,上面的代码在 UIControl 的自定义子类中执行,然后嵌入到 UIView ('ContentView') 中,该 UIView ('ContentView') 本身嵌入在滚动视图中。宽度限制或多或少是:
“ContentView”的宽度等于 ViewController 的视图。然后,UIControl 视图将其宽度设置为一个值,该值要么是屏幕宽度的一半,要么是屏幕宽度的四分之一,具体取决于确切的控件。(我有五个;一个占屏幕宽度的一半,其他都占四分之一并排成一排)。UIControl 然后通过约束设置 UIButton 的宽度等于它自己的宽度:H:|-(0)-[Button]-(0)-| .
更烦人的是,我从 UIViewController 的视图向下遍历并检查了每个约束——一些递归逻辑将给定视图中的每个约束和它的子视图应用于给定主题。然后我对视图层次结构中的每个对象运行它,并得到... zip。没有干扰的约束。除了上面应用比率约束的代码之外,没有什么会影响相关按钮的高度。