iOS 11,iPhone X。设置 contentOffset 时,UIScrollView 弹跳方向错误

标签 ios swift uiscrollview

我在 iPhone X、iOS 11.2(模拟器)上遇到 UIScrollView 问题

我注意到如果我不设置 scrollView.contentInsetAdjustmentBehavior = .never 就会发生这种情况。

我想实现一个简单的向上滚动元素并在其中滑动另一个元素的动画。显然,当我将 contentOffset 动画更改为值 (0, 546) 时,我得到了一点弹跳(检查图片):

incorrect behaviour

日志似乎证实了这一点:

scrollToBottom: insets top: 0.00; bottom: 74.00; left: 0.00; right: 0.00;
scrollToBottom: yPos 546.0
scrollToBottom: contentSize(375.0, 1240.0) self.height 768.0
scrollViewDidScroll: contentOffset (0.0, 496.333333333333)
scrollViewDidScroll: contentOffset (0.0, 486.0)
scrollViewDidScroll: contentOffset (0.0, 487.0)
scrollViewDidScroll: contentOffset (0.0, 489.0)
scrollViewDidScroll: contentOffset (0.0, 491.333333333333)
scrollViewDidScroll: contentOffset (0.0, 494.333333333333)
scrollViewDidScroll: contentOffset (0.0, 498.0)
scrollViewDidScroll: contentOffset (0.0, 501.666666666667)
scrollViewDidScroll: contentOffset (0.0, 506.0)
scrollViewDidScroll: contentOffset (0.0, 510.333333333333)
scrollViewDidScroll: contentOffset (0.0, 514.333333333333)

如您所见,开始时有大约 10 个单位反弹 496 -> 486 -> 现在增加。

如果(使用完全相同的代码)我插入更大的元素 - 一切都很好(检查图像):

normal behaviour

和日志:

scrollToBottom: insets top: 0.00; bottom: 214.00; left: 0.00; right: 0.00;
scrollToBottom: yPos 826.0
scrollToBottom: contentSize(375.0, 1380.0) self.height 768.0
scrollViewDidScroll: contentOffset (0.0, 498.666666666667)
scrollViewDidScroll: contentOffset (0.0, 506.0)
scrollViewDidScroll: contentOffset (0.0, 518.333333333333)
scrollViewDidScroll: contentOffset (0.0, 534.666666666667)
scrollViewDidScroll: contentOffset (0.0, 555.0)
scrollViewDidScroll: contentOffset (0.0, 578.666666666667)
scrollViewDidScroll: contentOffset (0.0, 604.666666666667)
scrollViewDidScroll: contentOffset (0.0, 632.333333333333)
scrollViewDidScroll: contentOffset (0.0, 661.0)

这方面的代码相当简单:设置初始元素、设置内容偏移量、获取完成动画的委托(delegate)调用、滑入新元素。

似乎如果我关闭内容插入调整行为,它就不会发生,但在那种情况下我必须自己处理插入。这似乎不会发生在装有 iOS 11.1 的 iPhone 6 上。

您知道为什么会发生这种情况以及如何解决它吗?

最佳答案

回答我自己的问题。

问题出在 iPhone X 上 contentSizecontentOffset 计算的组合上。

我正在计算偏移量,然后重新计算 contentSize。 "new"contentSize 存在差异,因此当我尝试滚动时 (setContentOffset(_:animated:)) 我同时更改了 contentSize 稍微(10 点,您可以在日志中看到)并获得反弹效果。

显然,对于较大的滚动距离,10 点并不那么重要,因此它们被“插值”掉了。

关于iOS 11,iPhone X。设置 contentOffset 时,UIScrollView 弹跳方向错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47912311/

相关文章:

ios - 从自定义数据建模 I/O 网格

ios - 如何删除 ios-chart 中的描述标签?

swiftui - 如何根据textview内容管理Scrollview Height Swiftui

ios - 从 json 获取搜索栏中的过滤数据

ios - 更改我的 NSString 中特定字符的字体系列

ios - 将图像链接转换为 UIImageView- Swift

ios - 为什么在 UIScrollView 中将 pagingEnabled 设置为 YES 会在触摸 subview 时自动滚动到上一页?

ios - POST 请求 Swift 3.0 Alamofire

ios - 找不到“firebase_messaging/FirebaseMessagingPlugin.h”文件

ios - ScrollView 仅显示最后添加的 subview