18

我有一个基于自动布局(约束)的应用程序,并注意到在方向更改后 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 报告的问题?

4

2 回答 2

32

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

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

幸运的是,有相当简单的解决方法。我尝试了各种组合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;
}
于 2013-01-20T20:38:43.610 回答
3

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

- (void)layoutSubviews
{
    [super layoutSubviews];

    CGSize contentSize = self.contentSize;
    contentSize.width  = self.bounds.size.width;
    self.contentSize   = contentSize;
}
于 2013-06-15T22:33:38.077 回答