UIButtons显示在视图下方,它们位于64位系统上时

时间:2015-03-16 00:43:31

标签: ios objective-c uibutton 64-bit

背景

我有一个视图层次结构:

enter image description here

...在UI预览中看起来像这样:

enter image description here

每个按钮由一个图标(“图像”属性)和一个背景图像(“背景”属性)组成。背景图像基本上是一个可调整大小的斜角框架,它与底层UIImageView(ButtonPanel)相结合,使按钮具有最终外观。

然后我在自定义segue(通向此控制器)中有一段代码,它在控制器的视图层次结构中的索引0处插入一个屏幕大小的视图:

background.tag = NSIntegerMax;
[[self.destinationViewController view] insertSubview:background atIndex:0];

现在这已经运行良好且没有任何问题......直到我将架构更改为包含arm64(64位)并在64位设备上运行它。


问题

在64位系统上运行应用程序时,会发生以下情况:

  • 只能看到中间按钮的图形。
  • 剩余按钮看起来好像隐藏或放在ButtonPanel下面,但它们不是(在调试器中验证)。而是在ButtonPanel下方渲染图形(通过垂直偏移ButtonPanel进行验证)。
  • 如果我移动中间按钮使x < 64点,然后它的图形也消失了(相反的事情发生在我向右移动它的右边缘比从右边缘边缘的64点更近)。
  • 如果我删除了insertSubview:atIndex:call,那么一切都按预期工作。

以下是一些说明问题的图片:

enter image description here

(只有中间按钮可见)

enter image description here

(与上面相同,但ButtonPanel垂直偏移-19点)


更多信息

为了关闭错误的根源,我们采取了以下步骤:

  • 我确保所有参与的视图都有tag = 0;
  • 所有与按钮相关的IBOutlets都已暂时删除;
  • 暂时删除了重现此错误不需要的所有其他视图;
  • 用insertSubview替换insertSubview:atIndex:belowSubview或addSubview:没有帮助;

其他可能相关的细节:


更新(2015-03-16)

我现在找到了问题的根源。引用代码中的“background”变量实际上是一个UIImageView,其image属性是使用渲染的屏幕截图设置的。屏幕截图使用以下方法呈现:

- (UIImage*) createImageOfView:(UIView*)view withSize:(CGSize)size {

    UIGraphicsBeginImageContextWithOptions(size, [view isOpaque], view.window.screen.scale);
    CGContextRef const context = UIGraphicsGetCurrentContext();

    [view.layer renderInContext:context];

    UIImage* const image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

我已经确定整个问题与在此方法中调用UIGraphicsBeginImageContextWithOptions有关。 但只有在包含图像的UIImageView插入到视图层次结构中时才会发生这种情况(即只是渲染截图不会导致问题。)

我现在尝试从资产cataglog分配图像,并出现同样的问题。因此,只有当UIImageView的图像属性为零时,一切都按预期工作;将image属性设置为任何有效图像会引入问题。

1 个答案:

答案 0 :(得分:0)

现在已经解决了!总共10个小时后...... 无论如何,这里发生了什么。

插入的背景视图在插入问题中提到的视图层次结构之前,参与了自定义的segue动画。这个动画是一个水平翻转&#34;。但是,我忘了重置用于此转换的转换。因此,背景视图的有效宽度基本为零(2.84217e-14)。将宽度为零的视图插入到视图层次结构中显然会导致64位体系结构出现奇怪的行为。

最初我试图强制改变框架,但是当框架没有响应时,它引导我的想法转换动画。因此,解决了整个问题的是在最终动画完成块中添加以下代码行:

fromView.layer.transform = CATransform3DIdentity;
toView.layer.transform = CATransform3DIdentity;

... fromView是&#34;背景&#34;从上面看。