Czy istnieje sposób, aby dowiedzieć się, czy UIScrollView
doszło do górnej lub dolnej części w środku
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView
willDecelerate:(BOOL)decelerate
?
dzięki.
Czy istnieje sposób, aby dowiedzieć się, czy UIScrollView
doszło do górnej lub dolnej części w środku
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView
willDecelerate:(BOOL)decelerate
?
dzięki.
Zaimplementuj UIScrollViewDelegate
w swojej klasie, a następnie dodaj to:
-(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
}
}
Mam nadzieję, że właśnie tego szukasz! W przeciwnym razie majstrować, dodając więcej warunków do powyższego kodu i NSLog wartość scrollOffset.
navigationController
, możesz chcieć zrobić coś bardziej podobnego:scrollOffset <= (0 - self.navigationController.navigationBar.frame.size.height - 20)
i(scrollOffset + scrollHeight) >= scrollContentSizeHeight
Cóż,
contentInsets
są również zaangażowane, gdy próbujesz określić, czy scrollView jest na górze, czy na dole. Mogą Cię również zainteresować przypadki, w których scrollView znajduje się powyżej i poniżej dołu. Oto kod, którego używam, aby znaleźć górne i dolne pozycje:Szybki:
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 } }
Cel 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
źródło
return scrollViewBottomOffset
nareturn scrollViewBottomOffset.rounded()
safeAreaInsets
również uwzględnij to.scrollView.contentOffset.y + scrollView.bounds.height - scrollView.safeAreaInsets.bottom
Jeśli chcesz, aby kod był szybki:
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 } }
źródło
Proste i przejrzyste rozszerzenie:
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 } }
W serwisie GitHub:
https://github.com/salutis/swift-scroll-view-edges
źródło
Dowiedziałem się dokładnie, jak to zrobić:
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! }
źródło
Zrób to w ten sposób (dla 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 } } }
źródło