iOS 8 UITableView轮换错误

时间:2014-10-07 07:39:55

标签: ios objective-c xcode ios8 xcode6

因此,在XCode 6上编译应用程序后,我注意到只有在iOS 8上运行时才会出现一个奇怪的错误: 更新其框架后UITableView采用了错误的内部尺寸。

现在我将尝试解释具体情况: 我们在其侧面旋转了UITableView,这基本上是横向UITableView。它通过tableView.transform = CGAffineTransformMakeRotation(-M_PI / 2);发生。 现在设置转换后,然后设置其框架 - 一切都很好。 但是,当然系统在大多数情况下会向父节点发送另一个帧更改,因为它需要将父节点设置为实际大小而不是XIB大小或任何初始化大小。在那一刻 - 当我重新发布子视图,包括表视图 - 一切都出错了。 实际上,表格视图的框架只是设置为包含视图的bounds,但随后是内部滚动视图(在iOS 8中,UITableView内部有另一个UIScrollView,称为{{ 1}}。由于UITableViewWrapperView本身就是UITableView,我无法弄清楚为什么他们需要另一个......)取一个等于父宽度的“高度”。而“height”实际上是UIScrollView属性,只能旋转。

现在我们可以很容易地估算出他们有一个错误,将内部width的宽度与父UIScrollView的实际宽度相关联,这可能是通过阅读UITableView而不是.frame.size.width。 但奇怪的是,在调查.bounds.size.width子视图的框架时 - 似乎它们都很好!所以它必须是某处的呈现问题。

所以我们留下了一个水平表,顶部有一个空白,因为单元格的“高度”是320而不是568,而单元格的“宽度”很好,设置为320。

我会非常高兴听到其他人遇到这个问题(或者来自Apple),但我终于找到了一个解决方案,并将问题发布在此处,以供将来参考我和其他人。

2 个答案:

答案 0 :(得分:1)

因此,使其表现的变化不是这样做的:

- (void)layoutSubviews
{
    tableView.frame = self.bounds;
}

我已经重置了变换,将帧设置为UITableView在变换后本地期望的边界,然后设置变换并设置正确的帧。这有点令人困惑,但在这里:

- (void)layoutSubviews
{
    if (UIDevice.currentDevice.systemVersion.floatValue >= 8.f)
    {
        // iOS 8 layout bug! Table's "height" taken from "width" after changing frame. But then if we cancel transform, set width/height to the final width/height, and rotate it and set to the virtual width/height - it works!

        CGRect rotatedFrame = self.bounds,
        unrotatedFrame = rotatedFrame;
        unrotatedFrame.size.width = rotatedFrame.size.height;
        unrotatedFrame.size.height = rotatedFrame.size.width;

        tableView.transform = CGAffineTransformIdentity;
        tableView.frame = unrotatedFrame;
        tableView.transform = CGAffineTransformMakeRotation(-M_PI / 2);
        tableView.frame = rotatedFrame;
    }
    else
    {
        tableView.frame = self.bounds;
    }
}

答案 1 :(得分:1)

这似乎是iOS8的新问题。当您想要旋转对象时,它不再显示围绕对象框架的左上角旋转。

针对iOS8的Apple文档说明了一个对象围绕它的中心点旋转了#34;。因此,当垂直UITableView旋转90度时,它可能会从视图中消失,因为中心点可能偏离可见区域。为了使表格看起来好像是围绕表格的左上角旋转,您现在还必须将帧的平移量等于帧宽度和帧高度之间的差值。

重要的是要注意你需要连接变换以获得所需的结果,如下所示:

首先创建90度旋转变换:

    CGAffineTransform xform_rotate = CGAffineTransformMakeRotation(-M_PI * 0.5);

然后创建一个等于表格宽度和高度之差的平移量变量:

float translateAmount = (camThumbsTableView.frame.size.height/2)-(camThumbsTableView.frame.size.width/2);

然后将原始旋转变换与翻译连接:

    CGAffineTransform xform_total = CGAffineTransformTranslate(xform_rotate, translateAmount, translateAmount);

完成后,您现在可以按如下方式转换tableView:

    self.camThumbsTableView.transform = xform_total;

这会产生旋转和平移tableView的效果,现在它似乎已经围绕tableView的左上角而不是围绕中心点旋转。

相关问题