2013-09-30 22 views
1

我有一个按钮,其图像在运行时动态设置。其结果是,为了维持适当的比例,我已经在图像被设定下面的代码:为什么我的UIButton忽略了它的自动布局约束来拉伸它的高度?

[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'),它本身嵌入在滚动视图中。宽度限制或多或少:

“ContentView”的宽度等于ViewController的视图。 然后,UIControl视图将其宽度设置为一个值,该值可以是屏幕宽度的大约一半或大约四分之一,具体取决于确切的控件。 (我有五个,一个是屏幕宽度的一半,另外一个是四分之一,并排成一排)。然后,UIControl通过约束设置UIButton的宽度等于它自己的宽度:H:| - (0) - [Button] - (0) - | 。

更烦人,我跑通过和检查从UIViewController的视图下来每约束 - 有点递归的逻辑,在一个给定的视图拉升每一个约束,它是应用于给定主题的子视图。然后,我对视图层次结构中的每个对象运行该对象,并得到... zip。没有干扰的限制。除了上面的代码,应用比率约束之外,没有任何内容会影响问题中hte按钮的高度。

回答

0

该解决方案实际上证明是相当尴尬明显,但我不知道我明白为什么该解决方案的工作(或上面的代码没有)。

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

显然,这张照片伸展到全尺寸的愿望是一个高度优先考虑的事情,所以我只能通过将我自己的要求提高来覆盖这个“无声”限制。 (有趣的是,在我添加优先级调用之前,这个错误实际上已经存在,这意味着一个约束并不是以这个优先级开始的 - 我怀疑当我们跳过它时,可能会让一个以上的程序员感到困惑)。

相关问题