ios - Swift - 向下滑动时如何分页
问题描述
加载帖子时,最近的帖子通常位于屏幕顶部,当用户向上滑动时,一旦滚动视图到达屏幕底部,显示的旧帖子正在使用此方法
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
let contentOffset = scrollView.contentOffset.y
let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height
if maximumOffset - contentOffset <= 40 {
handlePagination()
}
}
但是在加载消息时,情况正好相反。最新消息位于屏幕底部,当用户在 scrollView 到达屏幕顶部时向下滑动时,会显示较旧的消息。
有2种情况需要考虑:
1-通常在屏幕底部有一个 textField 或一个带有 sendButton 的 textView。如果用户没有触摸 textField/ 或 textView,他们只需向下滑动,一旦 scrollView 到达屏幕顶部handlePagination()
就会被调用以显示旧消息
2- 如果用户触摸 textView/Field,键盘会被抬起,即使他们在 textView/Field 中键入一些文本,他们仍然可以向下滑动以查看旧消息
问题是
1.如何检测用户何时向下滚动,以便handlePaginate()
在scrollView到达屏幕顶部时调用
和
2. 抬高时需要考虑键盘高度吗?
我可以使用键盘通知来检测键盘何时升起或未升起,并简单地将属性切换到键盘的高度。
var keyboardHeight: CGFloat = 0.0
@objc fileprivate func keyboardWillShow(notification: Notification) {
guard let keyboardDuration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double else { return }
guard let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardRectangle = keyboardFrame.cgRectValue
keyboardHeight = keyboardRectangle.height
}
@objc fileprivate func keyboardWillHide(notification: Notification) {
keyboardHeight = 0.0
}
解决方案
似乎我只需要检查 contentOffset 是否小于或等于 50
if contentOffset <= -40 {
handlePagination()
}
它在键盘被抬起和没有被抬起时起作用。
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
let contentOffset = scrollView.contentOffset.y
if contentOffset <= -40 {
handlePagination()
}
}
推荐阅读
- python - 我的 python pangram 函数有什么问题
- javascript - 如果在类名前添加句点,为什么 jQuery 中的 addClass() 方法不起作用?
- android - 未解决的参考数据绑定 - Android Studio 4.0
- c# - 无需用户即可访问 Azure DevOps API
- c - 为什么我不断收到“退出代码 11 完成进程”?
- reactjs - 如何使用 React 和 Axios 访问 movieDB API 的图像
- r - 使用 mutate 和 case_when 遍历列
- pjsip - PJSIP 客户端不确认邀请响应
- angular - Angular:ngIf 不适用于 object.property
- c++ - 在 C++ 上读取外部文件