Có cách nào để biết liệu a UIScrollView
đã đạt đến đỉnh hay đáy bên trong không
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView
willDecelerate:(BOOL)decelerate
?
cảm ơn.
Câu trả lời:
Triển khai UIScrollViewDelegate
trong lớp của bạn, rồi thêm cái này:
-(void)scrollViewDidScroll: (UIScrollView*)scrollView
{
float scrollViewHeight = scrollView.frame.size.height;
float scrollContentSizeHeight = scrollView.contentSize.height;
float scrollOffset = scrollView.contentOffset.y;
if (scrollOffset == 0)
{
// then we are at the top
}
else if (scrollOffset + scrollViewHeight == scrollContentSizeHeight)
{
// then we are at the end
}
}
Hy vọng đây là những gì bạn đang sau! Nếu không có người tinker bằng cách thêm nhiều điều kiện hơn vào đoạn mã trên và NSLog giá trị của scrollOffset.
Chà, contentInsets
cũng có liên quan, khi bạn cố gắng xác định xem scrollView ở trên cùng hay ở cuối. Bạn cũng có thể quan tâm đến các trường hợp khi scrollView của bạn ở trên đầu và dưới cuối. Đây là mã tôi sử dụng để tìm các vị trí trên cùng và dưới cùng:
Nhanh:
extension UIScrollView {
var isAtTop: Bool {
return contentOffset.y <= verticalOffsetForTop
}
var isAtBottom: Bool {
return contentOffset.y >= verticalOffsetForBottom
}
var verticalOffsetForTop: CGFloat {
let topInset = contentInset.top
return -topInset
}
var verticalOffsetForBottom: CGFloat {
let scrollViewHeight = bounds.height
let scrollContentSizeHeight = contentSize.height
let bottomInset = contentInset.bottom
let scrollViewBottomOffset = scrollContentSizeHeight + bottomInset - scrollViewHeight
return scrollViewBottomOffset
}
}
Mục tiêu-C:
@implementation UIScrollView (Additions)
- (BOOL)isAtTop {
return (self.contentOffset.y <= [self verticalOffsetForTop]);
}
- (BOOL)isAtBottom {
return (self.contentOffset.y >= [self verticalOffsetForBottom]);
}
- (CGFloat)verticalOffsetForTop {
CGFloat topInset = self.contentInset.top;
return -topInset;
}
- (CGFloat)verticalOffsetForBottom {
CGFloat scrollViewHeight = self.bounds.size.height;
CGFloat scrollContentSizeHeight = self.contentSize.height;
CGFloat bottomInset = self.contentInset.bottom;
CGFloat scrollViewBottomOffset = scrollContentSizeHeight + bottomInset - scrollViewHeight;
return scrollViewBottomOffset;
}
@end
return scrollViewBottomOffset
thànhreturn scrollViewBottomOffset.rounded()
safeAreaInsets
cũng ảnh hưởng đến nó. scrollView.contentOffset.y + scrollView.bounds.height - scrollView.safeAreaInsets.bottom
Nếu bạn muốn mã nhanh chóng:
override func scrollViewDidScroll(scrollView: UIScrollView) {
if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) {
//reach bottom
}
if (scrollView.contentOffset.y <= 0){
//reach top
}
if (scrollView.contentOffset.y > 0 && scrollView.contentOffset.y < (scrollView.contentSize.height - scrollView.frame.size.height)){
//not top and not bottom
}
}
Tiện ích mở rộng đơn giản và rõ ràng:
import UIKit
extension UIScrollView {
var scrolledToTop: Bool {
let topEdge = 0 - contentInset.top
return contentOffset.y <= topEdge
}
var scrolledToBottom: Bool {
let bottomEdge = contentSize.height + contentInset.bottom - bounds.height
return contentOffset.y >= bottomEdge
}
}
Trên GitHub:
Tôi đã tìm ra chính xác cách thực hiện:
CGFloat maxPosition = scrollView.contentInset.top + scrollView.contentSize.height + scrollView.contentInset.bottom - scrollView.bounds.size.height;
CGFloat currentPosition = scrollView.contentOffset.y + self.topLayoutGuide.length;
if (currentPosition == maxPosition) {
// you're at the bottom!
}
Làm như thế này (đối với Swift 3):
class MyClass: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) {
//scrolled to top, do smth
}
}
}
navigationController
, bạn có thể muốn làm một cái gì đó như thế này:scrollOffset <= (0 - self.navigationController.navigationBar.frame.size.height - 20)
và(scrollOffset + scrollHeight) >= scrollContentSizeHeight