【问题标题】:UITableView resize with auto layout on rotationUITableView 在旋转时使用自动布局调整大小
【发布时间】: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 的页脚视图。我认为它可以提供解决方案..
  • 不,我需要将它添加为子视图

标签: ios uitableview rotation autolayout


【解决方案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 遇到了类似的问题,当旋转到纵向到横向时没有正确滚动。只有一小部分表格是可滚动的。之后,一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    相关资源
    最近更新 更多