Swift - 如何在向下滑动时分页
Swift -How to Paginate when Swiping Down
加载 post 时,最近的 post 通常位于屏幕顶部,当用户 向上滑动 时,一旦 scrollView点击屏幕底部显示较早的 posts 正在使用此方法
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 到达屏幕顶部,就会显示较旧的消息。
有两种情况需要考虑:
1- 通常在屏幕底部有一个带有 sendButton 的 textField 或 textView。如果用户不触摸 textField/ 或 textView,他们只需向下滑动,一旦 scrollView 到达屏幕顶部,handlePagination()
将被调用以显示较早的消息
2- 如果用户触摸 textView/Field,键盘会升起,即使他们在 textView/Field 中键入了一些文本,他们仍然可以向下滑动以查看较旧的消息
问题是
1.如何检测用户何时向下滚动以便在 scrollView 到达屏幕顶部时调用 handlePaginate()
和
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()
}
}
加载 post 时,最近的 post 通常位于屏幕顶部,当用户 向上滑动 时,一旦 scrollView点击屏幕底部显示较早的 posts 正在使用此方法
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 到达屏幕顶部,就会显示较旧的消息。
有两种情况需要考虑:
1- 通常在屏幕底部有一个带有 sendButton 的 textField 或 textView。如果用户不触摸 textField/ 或 textView,他们只需向下滑动,一旦 scrollView 到达屏幕顶部,handlePagination()
将被调用以显示较早的消息
2- 如果用户触摸 textView/Field,键盘会升起,即使他们在 textView/Field 中键入了一些文本,他们仍然可以向下滑动以查看较旧的消息
问题是
1.如何检测用户何时向下滚动以便在 scrollView 到达屏幕顶部时调用 handlePaginate()
和
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()
}
}