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)toInterfaceOrientation duration:(NSTimeInterval)duration
self.tableView.frame = self.view.bounds;
我在容器视图中的 UITableView 遇到了类似的问题,当旋转到纵向到横向时没有正确滚动。只有一小部分表格是可滚动的。之后,一切正常。
【讨论】:
以上是关于UITableView 在旋转时使用自动布局调整大小的主要内容,如果未能解决你的问题,请参考以下文章
使用自动布局强制 UITableView 中的 UIView 填满屏幕
UITableview 没有在 iOS 中使用自动布局调整大小
使用自动布局的 UITableView 中的动态 UITextView 高度?