自定义UIButton上的Autolayout在某些设备上不起作用

时间:2014-06-06 00:30:19

标签: iphone objective-c ipad ios7 ios6

我正在开发一个具有暂停按钮的应用,该按钮的大小为自动布局。这有时会导致在drawRect中调用rect的正确大小,有时会导致{{0.0},{22,22}}(从来没有其他东西)导致一个非常小的暂停按钮。

- (void)drawRect:(CGRect)rect
{
    NSLog(@"%@", NSStringFromCGRect(rect));
    // Everything here follows the size of the rect to draw
}

22px似乎是随机的,因为该值不会出现在应用程序的任何位置。它让我想起的唯一一件事是我使用10px插图来绘制drawRect中的内容(只需设置x和y坐标,宽度和高度,UIButton上没有别的东西)所以42px - 2 * 10px将是22px。

我在IB中设置约束如下:

Overview of layouts applied in Interface builder

以下仿真器(Xcode 5.1.1)/硬件设备可以工作,因为它们为我提供了缩放输出,或者在输出为22px时不起作用:

  • iPhone iOS 6.1 22px
  • iPhone Retina 3,5" iOS7.1 47.5px
  • iPhone Retina 3,5" iOS6.1 22px
  • iPhone Retina 4" iOS6.1 22px
  • iPad Mini Retina iOS7.1 22px
  • iPad 2 iOS 6.1 22px
  • iPad 2 iOS 7.1 63px

IB中的按钮为42px。

这些是可以接受的限制条件:

po ((UIView*)self.pauseButton).constraints
<__NSArrayM 0x972e160>(
<NSLayoutConstraint:0x979ca10 V:[PauseButton:0x979c6d0(63)]>,
<NSLayoutConstraint:0x979ca40 H:[PauseButton:0x979c6d0(63)]>,
<NSContentSizeLayoutConstraint:0x961f4a0 H:[PauseButton:0x979c6d0(30)] Hug:250 CompressionResistance:750>,
<NSContentSizeLayoutConstraint:0x961f5f0 V:[PauseButton:0x979c6d0(33)] Hug:250 CompressionResistance:750>

布局失败时的相同点(这通常会引发非常奇怪的错误):

po [self.pauseButton constraints]
<__NSArrayM 0x7f59920>(
<NSLayoutConstraint:0x7f6f980 V:[PauseButton:0x7f6f720(22)]>,
<NSLayoutConstraint:0x7f6f9c0 H:[PauseButton:0x7f6f720(22)]>,
<NSContentSizeLayoutConstraint:0x7f6f360 V:[PauseButton:0x7f6f720(22)] Hug:250 CompressionResistance:750>
)

po [[UIWindow keyWindow] _autolayoutTrace]对于两者都是相同的,类似于一个空的VC,你在窗口上得到AMBIGUOUS LAYOUT和两个LayoutGuides:

*<UIWindow:0x108f537f0> - AMBIGUOUS LAYOUT
|   *<UIView:0x109409850>
|   |   *<_UILayoutGuide:0x109409c10> - AMBIGUOUS LAYOUT
|   |   *<_UILayoutGuide:0x10940a540> - AMBIGUOUS LAYOUT

其余的都没问题。

我不知道神奇的22px约束来自哪里,或者为什么它只出现在某些情况下。

2 个答案:

答案 0 :(得分:1)

我刚刚通过以下步骤解决了这个问题:

  • 从Interface Builder中完全删除PauseButton
  • 使用完全相同的设置再次添加
  • 从我正在测试的设备中删除应用

现在最让我担心的部分是,当我没有从设备中删除应用程序时,即使我运行PauseButton已经完全从IB中移除但仍然在我的ViewController上有一个IBOutlet它仍然会显示22px像这样的约束仍在那里。

只有在再次添加并从设备中删除应用程序后,它才会放弃这些幻像约束。

答案 1 :(得分:0)

我的猜测是因为你只设置了纵横比,而不是高度,宽度,尾随或底部约束;它的大小调整按钮以适应其内容,同时仍然尊重纵横比。尝试更改按钮标题或图像,或添加其他约束以查看其大小是否更合适。