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

Posted

技术标签:

【中文标题】UITableView 在旋转时使用自动布局调整大小【英文标题】:UITableView resize with auto layout on rotation 【发布时间】:2014-02-12 12:10:00 【问题描述】:

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

我有使用自动布局的 UITableView。 (捕捉到所有 4 个侧面的父级)。 如果我旋转设备,它会正确渲染,但如果我尝试滚动它,它只会在屏幕左侧滚动。

红色方块是滚动区域。

我假设的下一个问题是当我尝试将 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)]];

出现错误:

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

【问题讨论】:

你能给添加到表格视图中的视图赋予不同的颜色,看看它在横向模式下是如何呈现的吗? 是的,最初我将视图涂成红色,我只是没有复制那部分代码:D 添加的视图应该隐藏您的表格视图。我不知道你这样做的目的是什么。无论如何,您可能打算这样做。但我的建议是,您可以将主视图添加为 UITableView 的页脚视图。我认为它可以提供解决方案.. 不,我需要将它添加为子视图 【参考方案1】:

对于自动布局打开 - (不要设置任何帧 - 它会给出奇怪的行为) 您的自动布局约束应如下所示:

您的自动布局已开启

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

【讨论】:

我知道。请再次阅读问题。我在您发布时打开了自动布局,旋转时,它看起来不错,但滚动区域不是。【参考方案2】:

尝试设置一个随机的估计行高度,它似乎修复了这个错误。这很可能是来自 Apple 的错误。斯威夫特版本:

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

【讨论】:

你也可以只设置一个高度限制,它也会修复它,不管是什么原因。【参考方案3】:

这里用

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

代替

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

【讨论】:

我的问题是滚动区域与显示区域不同,使用自动布局。为此,我根本不使用框架。【参考方案4】:

看起来超级视图的方向变化没有传递给您的孩子(tableView)。尝试将以下内容放入 willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterf‌​aceOrientation duration:(NSTimeInterval)duration

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

我在容器视图中的 UITableView 遇到了类似的问题,当旋转到纵向到横向时没有正确滚动。只有一小部分表格是可滚动的。之后,一切正常。

【讨论】:

以上是关于UITableView 在旋转时使用自动布局调整大小的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局强制 UITableView 中的 UIView 填满屏幕

Xcode 自动布局和旋转

UITableview 没有在 iOS 中使用自动布局调整大小

使用自动布局的 UITableView 中的动态 UITextView 高度?

使用自动布局对 uitableview 页脚视图进行运行时扩展

在 UITableView 标头中将标签约束设置为 0 时自动布局失败