1

我有一个按钮,其图像是在运行时动态设置的。因此,为了保持适当的比例,我在设置图像的位置有以下代码:

[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。没有干扰的约束。除了上面应用比率约束的代码之外,没有什么会影响相关按钮的高度。

4

1 回答 1

0

该解决方案实际上被证明是相当令人尴尬的明显,尽管我不确定我是否理解该解决方案为什么有效(或者上面的代码没有)。

在上面的代码中,我使用了常量 'UILayoutPriorityDefaultHigh';在我的初始化代码中,我使用了常量“UILayoutPriorityRequired”。

显然,将照片拉伸到完整尺寸的愿望是一个高优先级,所以我只能通过将自己的设置提高到要求来覆盖这个“无声”约束。(有趣的是,在我完全添加优先级调用之前,该错误实际上就存在,这表明约束不是从该优先级开始的——我怀疑当他们绊倒它时可能会混淆不止一个程序员)。

于 2013-10-01T00:04:41.833 回答