【问题标题】:Why is my UIButton ignoring its autolayout constraint to stretch its height?为什么我的 UIButton 忽略了它的自动布局约束来拉伸它的高度?
【发布时间】:2013-10-06 23:12:58
【问题描述】:

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

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

【问题讨论】:

    标签: ios objective-c autolayout


    【解决方案1】:

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

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

    显然,将照片拉伸到完整尺寸的愿望是一个高优先级,因此我只能通过将自己的设置提高到要求来覆盖“静默”约束。 (有趣的是,这个 bug 在我添加优先级调用之前就已经存在了,这表明一个约束并不是从那个优先级开始的——我怀疑当他们绊倒它时可能会让不止一个程序员感到困惑)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      相关资源
      最近更新 更多