我正在开发一个具有暂停按钮的应用,该按钮的大小为自动布局。这有时会导致在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中设置约束如下:
以下仿真器(Xcode 5.1.1)/硬件设备可以工作,因为它们为我提供了缩放输出,或者在输出为22px时不起作用:
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约束来自哪里,或者为什么它只出现在某些情况下。
答案 0 :(得分:1)
我刚刚通过以下步骤解决了这个问题:
现在最让我担心的部分是,当我没有从设备中删除应用程序时,即使我运行PauseButton已经完全从IB中移除但仍然在我的ViewController上有一个IBOutlet它仍然会显示22px像这样的约束仍在那里。
只有在再次添加并从设备中删除应用程序后,它才会放弃这些幻像约束。
答案 1 :(得分:0)
我的猜测是因为你只设置了纵横比,而不是高度,宽度,尾随或底部约束;它的大小调整按钮以适应其内容,同时仍然尊重纵横比。尝试更改按钮标题或图像,或添加其他约束以查看其大小是否更合适。