【问题标题】:bug in UITableView layout after orientation change方向更改后 UITableView 布局中的错误
【发布时间】:2012-12-27 17:44:57
【问题描述】:

我有一个基于自动布局(约束)的应用程序,并注意到在方向更改后 tableview 存在问题。 repro 步骤如下(我有一个非常基本的 repro 应用程序 - 带有一个 tableview 和一个添加新项目的添加按钮)。

  1. 将您的应用程序旋转到横向模式,以便 tableview 现在是横向的。
  2. 向 tableview 添加项目,请参阅下面的 1
  3. 旋转回纵向,tableview 现在将浮动在水平平移上(好像滚动查看器的内容大小是横向),请参阅 [2]

1要添加的代码

- (IBAction)onAdd:(id)sender {
    count ++;
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:count-1 inSection:0]] withRowAnimation:UITableViewRowAnimationBottom];
}

[2] 浮动表格视图

关于如何解决这个问题的任何想法?另外,我如何判断这是已知问题还是我应该向 Apple 报告的问题?

【问题讨论】:

  • 你能发布你的示例应用吗?
  • 您是使用 UITableViewController 还是 UITableView 作为 UIViewController 中的子视图?如果它是子视图,则可能是 tableview 的布局问题。
  • 这是一个 UITableView 作为 UIViewController 的子视图
  • 我没有任何“自动旋转”代码。表格视图仅使用 IB 中的自动布局。除非您在上述场景中添加一行,否则它工作正常。
  • 注意,这个问题不会在一个完整的 UITableViewController 中重现,只有一个子视图 UITableView

标签: ios objective-c xcode uitableview autolayout


【解决方案1】:

我认为这是一个错误;如果您将项目从自动布局转换并设置适当的调整大小蒙版,一切正常。您应该提交一个错误,特别是因为您有一个可以很好地重现它的简单示例项目。

在您的情况下发生的事情正如您所怀疑的那样 - 滚动视图的内容视图保持在横向宽度,即使视图本身已调整为纵向,因此您突然获得了水平拖动的能力。

幸运的是,有相当简单的解决方法。我尝试了setNeedsLayoutsetNeedsUpdateConstraints 的各种组合但没有成功,但您可以实现以下两种解决方案之一:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

或者,

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    CGSize contentSize = self.tableView.contentSize;
    contentSize.width = self.tableView.bounds.size.width;
    self.tableView.contentSize = contentSize;
}

【讨论】:

  • 如果我使用一个带有分段控制和子视图控制器的容器视图控制器,它将不起作用。
  • 感谢您的帮助!但您可能忘记调用 [super didRotateFromInterfaceOrientation]
  • 在 iOS 6 中,UITableView 在更改其约束后的行为出现问题。 beginUpdates 和 endUpdates 救了我。非常感谢
【解决方案2】:

我发现上面的答案大部分时间都有效,但并非所有时间都有效。最健壮的解决方案是继承 UITableView 并在 layoutSubviews 中设置 contentSize:

- (void)layoutSubviews
{
    [super layoutSubviews];

    CGSize contentSize = self.contentSize;
    contentSize.width  = self.bounds.size.width;
    self.contentSize   = contentSize;
}

【讨论】:

    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多