切换到iOS 7后,UITableView不会滚动

时间:2013-09-24 04:01:25

标签: iphone uitableview ios7 quickdialog

在iOS 6中,我在我的应用中使用UITableView创建了QuickDialog。它滚动正常。当我切换到iOS 7时,相同的UITableView无法正确滚动。我可以拖到底部(滚动条压缩)但是当我释放时,它会弹回到顶部。我一直在玩viewDidAppear来尝试诊断问题。请参阅下面的代码块。

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"Content height: %f",self.quickDialogTableView.contentSize.height);
    [self.quickDialogTableView reloadData];
    NSLog(@"Content height: %f",self.quickDialogTableView.contentSize.height);
    [self.quickDialogTableView layoutIfNeeded];
    NSLog(@"Content height: %f",self.quickDialogTableView.contentSize.height); 
 }

iOS 7中此块的输出是

Content height: 0.000000
Content height: 836.000000
Content height: 0.000000

同时,iOS 6(模拟器)中此块的输出是

Content height: 836.000000
Content height: 836.000000
Content height: 836.000000

另外,为了尝试诊断问题,我设置了一个触发[self.quickDialogTableView reloadData]的按钮。每当按下该按钮时,滚动行为开始正常运行。然后,当我离开视图并返回时,滚动再次失败(直到按下按钮)。为了清楚起见,我试图将reloadData单独放在viewWillAppear中(即删除上面代码块中的最后两行)并且它不会更正滚动。

我正在寻找解决问题的线索。提前感谢您的帮助。

5 个答案:

答案 0 :(得分:7)

好的,所以我无法找出问题的根源,但我确实找到了一个希望帮助其他人的解决方法。或者至少,也许可以帮助别人指出真正的错误。

我创建了一个名为trueContentSize的属性,我存储了正确的大小。

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.quickDialogTableView reloadData]; // Calculates correct contentSize
    self.trueContentSize = self.quickDialogTableView.contentSize; 
}

然后,在-viewDidLayoutSubviews中,我手动更正了contentSize

-(void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    self.quickDialogTableView.contentSize = self.trueContentSize; 
}

答案 1 :(得分:3)

想到我可能会在这里投两分钱。

同样的问题发生在我身上。表格首先加载正常,但导航到其他屏幕,返回,并且表格视图contentSize0,0且不可滚动。 Fausto的解决方法也不可靠。

对我而言,事实证明只是在topLayoutGuide中引用-viewWillLayoutSubviews的行为。这样做会导致上述所有症状。在新项目中尝试:

  1. 在标签控制器中设置表格视图控制器。
  2. 只提供静态内容的30行。
  3. 运行,您可以滚动。切换标签,然后返回,然后滚动。
  4. NSLog(@"%@", self.topLayoutGuide);
  5. 中添加-viewWillLayoutSubviews
  6. 再次运行,您可以滚动,但切换标签,不再滚动。
  7. 怪异。听起来像是一个iOS错误,或者你不应该在该方法中引用topLayoutGuide。删除对该属性的任何引用都将解决问题。

    编辑:截至今年早些时候,Apple通过雷达报告确认我认为这是一个iOS错误。不要引用topLayoutGuide直到它被解决(无论什么时候,嘿)。 :)

答案 2 :(得分:1)

这是我目前的临时修复。有人想出真正的解决办法吗?

@interface UITableView (Extension)
@end

@implementation UITableView (Extension)

- (void)setContentSize:(CGSize)contentSize {
  if (contentSize.height != 0) {
    [super setContentSize:contentSize];
    NSLog(@"set content height %f", contentSize.height);
  } else {
    NSLog(@"set content size zero");
  }
}

@end

答案 3 :(得分:0)

遇到同样的问题,找到的唯一解决方案是重新加载表中的数据。希望有所帮助。

答案 4 :(得分:0)

我有类似的问题。我的问题是我在故事板中为表视图设置了明确的高度。通过设置与上方/下方视图的距离来更新我的表视图以使用自动布局使它对我有用。