首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >方向更改后UITableView布局中的错误

方向更改后UITableView布局中的错误
EN

Stack Overflow用户
提问于 2013-01-14 03:03:59
回答 2查看 19.9K关注 0票数 18

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

  1. 将应用程序旋转到横向模式,使表视图现在成为横向视图。
  2. 向表视图添加项目请参阅
  3. 下方的1转回纵向,此时表视图将在水平平移上浮动(就像滚动查看器内容大小为横向一样),请参见2

要添加的1代码

代码语言:javascript
复制
- (IBAction)onAdd:(id)sender {
    count ++;
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:count-1 inSection:0]] withRowAnimation:UITableViewRowAnimationBottom];
}

2浮动表视图

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-21 04:38:44

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

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

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

代码语言:javascript
复制
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

或,

代码语言:javascript
复制
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    CGSize contentSize = self.tableView.contentSize;
    contentSize.width = self.tableView.bounds.size.width;
    self.tableView.contentSize = contentSize;
}
票数 32
EN

Stack Overflow用户

发布于 2013-06-16 06:33:38

我发现上面的答案在大多数情况下是有效的,但不是所有时间都有效。最健壮的解决方案是将UITableView子类化并在layoutSubviews中设置contentSize:

代码语言:javascript
复制
- (void)layoutSubviews
{
    [super layoutSubviews];

    CGSize contentSize = self.contentSize;
    contentSize.width  = self.bounds.size.width;
    self.contentSize   = contentSize;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14307037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档