为什么我的UIButton忽略了它的自动布局约束来拉伸它的高度?

时间:2013-09-30 22:52:53

标签: ios objective-c autolayout

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

[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”的宽度等于ViewController的视图。 然后,UIControl视图将其宽度设置为一个值,该值要么大约是屏幕宽度的一半或大约四分之一,具体取决于确切的控件。 (我有五个;一个得到屏幕宽度的一半,其他都得到四分之一并排成一排)。 然后,UIControl通过约束将UIButton的宽度设置为等于它自己的宽度:H:| - (0) - [Button] - (0) - |

更令人讨厌的是,我从UIViewController的视图中查看了每个约束 - 一些递归逻辑,它提取了给定视图中的每个约束,并且它是应用于给定视图的子视图学科。然后我针对视图层次结构中的每个对象运行它,并获得... zip。没有干扰的约束。除了上面的代码之外,什么都不应该影响问题的hte按钮的高度,这些代码应用了比率约束。

1 个答案:

答案 0 :(得分:0)

实际证明这个解决方案相当令人尴尬,但我不确定为什么解决方案有效(或上面的代码没有)。

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

显然,照片希望延伸到它的全尺寸是一个高优先级,所以我只能通过提升自己的要求来覆盖那种“沉默”约束。 (有趣的是,在我添加优先级调用之前,错误确实存在,这表明约束并不是以优先级开始的 - 我怀疑当他们绊倒时,可能会让多个程序员感到困惑。) p>