切换到 iOS 7 后 UITableView 不滚动

Posted

技术标签:

【中文标题】切换到 iOS 7 后 UITableView 不滚动【英文标题】:UITableView not scrolling after switching to iOS 7 【发布时间】:2013-09-24 04:01:24 【问题描述】:

ios 6 中,我在我的应用程序中使用 QuickDialog 创建了一个 UITableView。它正常滚动。当我切换到 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 中(即删除上面代码块中的最后两行)并且它不能更正滚动。

我正在寻找有关我可以在哪里解决问题的线索。提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

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

我创建了一个名为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; 

【讨论】:

这看起来行不通,果然,它不适合我。我面临同样的问题,但是,在您的解决方案中,您只是从 viewDidAppear 中的 quickDialogTableView 中获取 contentSize:然后在 viewDidLayoutSubviews 中再次将其重新分配给 quickDialogTableView 的 contentSize ...我不明白如何解决问题。 @Jamornh 同意。这没有任何意义。但是,如果我在self.quickDialogTableView.contentSize = self.trueContentSize; 之前将self.quickDialogTableView.contentSize 记录在-viewDidLayoutSubviews 中,则结果为零。所以-viewDidAppearviewDidLayoutSubviews 之间发生了一些事情,将contentSize 设置为零。我不知道是什么。很抱歉听到我的 hack 对你不起作用。您是否检查以确保您的自定义 self.trueContentSize 属性在使用之前返回了您的预期大小? 我已经设法通过手动重置 tableView 的超级视图的框架和边界然后重置 tableView 的框架以适应它,以便 tableView 的 contentSize 大于它的框架。显然滚动不起作用,因为 tableView 的框架由于某种原因大于 contentSize。感谢您的回复! 这对我有用。当您从情节提要到达 QuickDialog 时,这似乎是一个已知问题。这是他们 github 上的问题:github.com/escoz/QuickDialog/issues/588【参考方案2】:

只是想我可能会在这里投入两分钱..

同样的问题发生在我身上。一开始表格加载正常,但导航到不同的屏幕,回来,表格视图的contentSize0,0 并且不可滚动。 Fausto 的解决方法也不能可靠地工作。

结果对我来说只是在-viewWillLayoutSubviews 中引用topLayoutGuide 的行为。这样做会导致上述所有症状。在新项目中尝试一下:

    在选项卡控制器中设置表格视图控制器。 给它 30 行,仅包含静态内容。 运行,您可以滚动。切换标签,然后返回,您可以滚动。 在-viewWillLayoutSubviews 中添加NSLog(@"%@", self.topLayoutGuide); 再次运行,可以滚动,但切换选项卡,不再滚动。

很奇怪。听起来像是一个 iOS 错误,或者您不应该在该方法中引用 topLayoutGuide。删除对该属性的任何引用将解决此问题。

编辑:截至今年早些时候,Apple 通过雷达报告确认这是一个 iOS 错误。在解决之前不要引用topLayoutGuide(无论何时,嘿)。 :)

【讨论】:

同样的问题!只需注释掉 topLayoutGuide 调用,表格滚动就可以正常工作...... 找到了解决方法:将 UITableViewController 替换为普通自定义 UIViewController。这里:***.com/questions/19595479/…【参考方案3】:

这是我目前的临时修复。有人知道真正的解决方法吗?

@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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

我遇到了类似的问题。我的问题是我在情节提要中为表格视图设置了明确的高度。通过设置与上方/下方视图的距离来更新我的表格视图以使用自动布局使其对我有用。

【讨论】:

以上是关于切换到 iOS 7 后 UITableView 不滚动的主要内容,如果未能解决你的问题,请参考以下文章

ios 7 uitableview 所选单元格在 beginupdates 后失去边框

为啥我的 UITableView 在 iOS 7 中被切断了?

UITableView 在 iOS 7 中不根据其高度显示

iOS 7:在 UITableView / delaysContentTouches 中拖动似乎不起作用

在 iOS 7 上滚动到 UITableView 的底部?

在 IOS 8 中工作的具有动态高度的 UITableView 行在 ios 7 中不工作