就这样,我有一个UIViewController,在其中我有一个ContainerView嵌入一个UITableViewController.我想要的高度是屏幕的50%.
当我使用refreshControl时,我得到这样的行为:The tableView jumps down at the very end when scrolling down. You’ll notice it towards the end of this video when I decide to scroll down slowly.
当ContainerView框架高于某个值时,不会发生此问题.所以,当高度是屏幕的75%时,一切都可以完美地实现,并且refreshControl很顺利.当它是50%时,那个bug就会发生.
我试过的两件事情
> self.tableView.frame = CGRectMake(0,numOfPixelsToDropTableBy,self.tableView.frame.size.width,self.tableView.frame.size.height)是我尝试的一件事.这样做的问题是如果要通过ContainerView给出tableView圆角,并且事实上,您的ContainerView仍然占用更多的空间,这会使其他元素的约束变得尴尬.
>我去了故事板,我基本上是我想要的ContainerView的顶部.然后,我的底部扩展到屏幕底部,给了ContainerView足够大的高度,但用户永远不会知道.除了他们会知道,因为现在tableView延伸到屏幕之外,我看不到我的tableView的最后几行.
解决方法
如果您使用基于边界的约束或您的容器视图的任何种类的边距,跳跃似乎就会发生.如果删除边界相对于约束的一部分,则跳跃消失.
很奇怪,但似乎是问题.一旦为容器添加任何边距相对约束,问题就会返回.将其移除并显示回到平滑滚动.
更新:
再看一遍,一旦容器视图不是屏幕的整个宽度,问题似乎就会出现.向容器视图添加任何类型的边距(通过相对于边距的布局或通过在约束上设置非零偏移)导致跳跃行为.
更新:
UITableView在容器视图内滚动显示的东西似乎有根本的区别,容器视图有任何边缘.如果您覆盖滚动委托,滚动视图的内容偏移/边界将在刷新即将触发的时刻更改.这是一些调试显示问题
Start pulling down: Scroll bounds = {{0,-127.33333333333333},{374,423}} Scroll pos = [0.000000,-127.333333] Scroll bounds = {{0,-127.66666666666667},-127.666667] Scroll bounds = {{0,-128.33333333333334},-128.333333] Ok before here -------> Activity spinner becomes fully populated. Jump in scroll position upwards. Scroll bounds = {{0,-104},-104.000000] Scroll position corrects itself Scroll bounds = {{0,-128.333333] Scroll position jumps the other direction by the same amount Scroll bounds = {{0,-151.33333333333334},-151.333333] Value changed target action fires. Bounds seem to reset (think 44 is height of refresh control Scroll bounds = {{0,-44},-44.000000] Corrects back Scroll bounds = {{0,-151.333333] Fully corrects to the right scroll position by jumping back. Ok after here ------> Scroll bounds = {{0,-128.66666666666666},-128.666667] Scroll bounds = {{0,-129},-129.000000] Scroll bounds = {{0,-129.33333333333334},-129.333333] Scroll bounds = {{0,-129.66666666666666},-129.666667] Scroll bounds = {{0,-130},423}}
结论
似乎没有简单的方法可以找到解决这个问题.我试图创建我自己的表视图控制器,跳跃消失,但被不同的效果所替代:当您向下滚动顶部单元格消失时,然后重新出现.我想象它与同样的内部问题有关,只是表达不同.
不幸的是,你可能不得不忍受这种效果,或者没有余地.我会提出一个与苹果的错误报告.
只有其他选项才能在您的UITableViewCells中创建边距.您可以使单元格内容视图具有清晰的背景,并使用内部容器视图为单元格内容向单元格引入左右边距.我认为这可能是你最好的机会.
最后…
不要被击败,您可以将缩放变换应用于表视图的导航控制器,以在表视图控制器中创建一个执行以下操作的余量:
override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) // Add a scaling transform to the whole embedded controller view. self.navigationController!.view.transform=CGAffineTransformMakeScale(0.9,0.9); }
这使得嵌入式控制器的视图看起来比90%更小,因此在边框周围有一个边距.将刻度更改为更改边框大小.