就这样,我有一个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的最后几行.
最终…我不想使用第三方库,但我想要一个完美的功能refreshControl.如何解决这个问题?
解决方法
如果您使用基于边界的约束或您的容器视图的任何种类的边距,跳跃似乎就会发生.如果删除边界相对于约束的一部分,则跳跃消失.
很奇怪,但似乎是问题.一旦为容器添加任何边距相对约束,问题就会返回.将其移除并显示回到平滑滚动.
这似乎是一个错误,我认为你将需要提出一个与苹果的错误报告.
更新:
再看一遍,一旦容器视图不是屏幕的整个宽度,问题似乎就会出现.向容器视图添加任何类型的边距(通过相对于边距的布局或通过在约束上设置非零偏移)导致跳跃行为.
更新:
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%更小,因此在边框周围有一个边距.将刻度更改为更改边框大小.
不理想,但完美无瑕,无跳转,有边框.它也使您完全免费使用圆角等,因为整个内容被缩放.