UITableView在旋转时使用自动布局调整大小

时间:2014-02-12 12:10:00

标签: ios uitableview rotation autolayout

我有一些奇怪的错误,我无法找到解决方案。

我使用自动布局的UITableView。 (在所有4个方面与父母对齐)。 如果我旋转设备,它会被正确渲染,但如果我尝试滚动它,请在屏幕左侧滚动onelly。

enter image description here

红色方块是滚动区域。

我假设下一个问题是连接到这个问题,当我尝试将UIView作为subView添加到UITableView时。

如果我添加:

CGRect frame = CGRectMake(0, 200, self.table.frame.size.width, 5);
UIView * mainView = [[UIView alloc]initWithFrame:frame];
mainView.backgroundColor = [UIColor redColor];
[self.table addSubview:mainView];

没问题,但如果我愿意的话:

UIView * mainView = [[UIView alloc]init];
mainView.backgroundColor = [UIColor redColor];
mainView.translatesAutoresizingMaskIntoConstraints = NO;
[self.table addSubview:mainView];

[self.table addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(200)-[mainView(20)]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(_table, mainView)]];

[self.table addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[mainView]|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(_table, mainView)]];

得到na错误:

*** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit/UIKit-2903.23/UIView.m:8540

4 个答案:

答案 0 :(得分:2)

对于Autolayout打开 - (不要设置任何帧 - 它会产生奇怪的行为)
您的Autolayout限制应如下所示:


您的Autolayout已开启

Your Autolayout is turned on


Your constraints should like this

如果您关闭自动布局,则不需要对您的故事或代码进行任何更改

答案 1 :(得分:1)

尝试设置随机的estimatedRowHeight,它似乎可以解决这个问题。它可能是Apple的一个错误。 Swift版本:

class MyTableView: UITableView {
    override func layoutSubviews() {
        self.estimatedRowHeight = 120
        super.layoutSubviews()
    }
}

答案 2 :(得分:0)

这里使用

CGRect frame = CGRectMake(0, 200, self.table.bounds.size.width, 5);

取代

CGRect frame = CGRectMake(0, 200, self.table.frame.size.width, 5);

答案 3 :(得分:0)

看起来superview的方向更改不会传递给您的孩子(tableView)。尝试将以下内容放入willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterf aceOrientation duration:(NSTimeInterval)duration

self.tableView.frame = self.view.bounds;

我在容器视图中遇到了类似的问题,当旋转到纵向到横向时,它没有正确滚动。只有一小部分桌子可以滚动。在那之后,一切运作良好。