将视图添加/删除到表视图的超级视图后,UITableView 停止滚动

Posted

技术标签:

【中文标题】将视图添加/删除到表视图的超级视图后,UITableView 停止滚动【英文标题】:UITableView stops scrolling enough after I add/remove a view to the superview of table view 【发布时间】:2013-10-14 09:33:33 【问题描述】:

这是我面临的问题。我在主视图中有 UITableView。当用户点击菜单按钮时,视图被添加到 superview 的视图层次结构中,并且该视图覆盖了除菜单按钮之外的所有屏幕。那就是我打电话

[self.view insertSubview:self._menuView belowSubview:self._menuButton]

用户再次点击菜单按钮后,我调用

[self._menuView removeFromSuperview]

但是,在此之后,UITableView 停止滚动,实际上它滚动了一点点,几个像素,然后弹回到我插入 _menuView 之前的位置。我在插入和删除_menuView后监控了菜单层次结构,它实际上被删除了,而且没有覆盖UITableVIew的视图,所以其他一些视图不可能从UITableView窃取触摸。可能是什么问题?有什么想法吗?

编辑 1: 我注意到除了无法滚动之外,还发生了另一件奇怪的事情。当我显示 menuView 时,tableView 滚动到顶部,没有动画。 (menuView 只是半透明的,所以我可以看到它下面的 tableView)

编辑2:我在插入_menuView之前和之后监控了tableView的contentSize和contentOffset,无法滚动的原因是contentSize发生了某种变化。

TABLE VIEW BEFORE INSERTING MENU - contentSize:Width=320, Height=10519 contentOffset:X=0, Y=3980
TABLE VIEW AFTER INSERTING MENU - contentSize:Width=320, Height=44 contentOffset:X=0, Y=0

如您所见,高度更改为 44,这就是我无法滚动的原因。而且,正如我在 EDIT 1: 中所说,tableView 被滚动到顶部 - 所以你可以看到 contentOffset 也归零。任何想法为什么内容大小会自动更改?

提前致谢。

【问题讨论】:

menuView 是具有相同委托/数据源的 tableview 吗? 不,tableView 的数据源/委托是一个单独的对象。和menuView无关。 【参考方案1】:

我认为您的 tableview 框架有问题。删除子视图后,尝试将 tableview 的框架设置为其原始框架。也许这会解决你的问题

【讨论】:

其实我已经说过了,我在插入前后监控UIViews,frame没有变化。 可以,但截图是静态的,我认为这无助于确定问题。【参考方案2】:

UITableView 中的内容是自动组织的,仅用于显示单元格和页眉/页脚元素。为了正常工作,您应该将表格包装到 parentView 并将菜单添加到该 parentView 而不是 UITableView。您也可以尝试在 table 上调用 reloadData 方法,因为它可以恢复视图的内容大小。

【讨论】:

我没有向 UITableView 添加菜单,正如我在问题中所描述的,我将 tableView 添加到超级视图(父视图)。我不想重新加载数据。我想了解为什么要为 UITableView 的行为添加另一个视图效果。 当菜单出现时,您的代码似乎确实在 UITableView 或其数据源上执行了一些方法。没有它就不可能暴露这种行为(菜单和 UITableView 是兄弟姐妹,对吧?)。可能是您错过了一些回调或其他事件?其他可能是导航栏和内部内容偏移问题,但我假设您的父视图是空白视图。 目前我想不出你所说的任何一个问题。如果我找到它,我会写答案。谢谢你的回答。

以上是关于将视图添加/删除到表视图的超级视图后,UITableView 停止滚动的主要内容,如果未能解决你的问题,请参考以下文章

将新行添加到表后动态创建视图

如何在运行时从超级视图中删除视图?

何时将子视图从情节提要添加到超级视图?

以编程方式从超级视图中删除视图后更新约束/框架(自动布局)

滑动后调整超级视图大小时,UIPageViewController 视图会跳转

以编程方式将视图添加到表视图中的单元格