Ответ 1
Вы думали добавить логическое значение. обновите его, когда метод вызывается в первый раз и, возможно, когда пользователь прокручивает резервную копию.
У меня есть UIScrollView с изображениями, и когда пользователь прокручивает до конца scrollview, я хочу обновить содержимое. Это мой код, чтобы определить, когда достигается нижняя часть прокрутки:
Код ниже реализован в scrollViewDidScroll:
delegate
CGFloat scrollViewHeight = imagesScrollView.bounds.size.height;
CGFloat scrollContentSizeHeight = imagesScrollView.contentSize.height;
CGFloat bottomInset = imagesScrollView.contentInset.bottom;
CGFloat scrollViewBottomOffset = scrollContentSizeHeight + bottomInset - scrollViewHeight;
if(imagesScrollView.contentOffset.y > scrollViewBottomOffset){
[imagesView addSubview:imagesBottomLoadingView];
[self downloadImages];
}
Моя проблема в том, что когда пользователь прокручивается вниз, моя функция вызывается несколько раз, но я хочу называть ее только один раз. Я попытался с imagesScrollView.contentOffset.y == scrollViewBottomOffset, но он не работает и функция не называется
Вы думали добавить логическое значение. обновите его, когда метод вызывается в первый раз и, возможно, когда пользователь прокручивает резервную копию.
Если вы хотите быстро их обнаружить:
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
}}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
float bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height;
if (bottomEdge >= scrollView.contentSize.height)
{
// we are at the end
}
}
Карлос, ответ лучше.
Для Swift 4.x вы должны изменить имя метода:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if (scrollView.contentOffset.y + 1) >= (scrollView.contentSize.height - scrollView.frame.size.height) {
//bottom reached
}
}
реализовать scrollViewDidScroll:
и проверить contentOffset
тем, что для достижения конца
Иногда вам придется использовать +1 в условии, потому что contentSize.height дает вам несколько десятичных знаков, поэтому, если вы используете это, вы избегаете этого...
override func scrollViewDidScroll(scrollView: UIScrollView) {
if (scrollView.contentOffset.y + 1) >= (scrollView.contentSize.height - scrollView.frame.size.height) {
//bottom reached
}
}
Для Swift 4.5:
func scrollViewDidScroll(_ scrollView: UIScrollView)
{
let scrollViewHeight = scrollView.frame.size.height
let scrollContentSizeHeight = scrollView.contentSize.height
let scrollOffset = scrollView.contentOffset.y
if (scrollOffset == 0)
{
// then we are at the top
print("then we are at the top")
}
else if (scrollOffset + scrollViewHeight == scrollContentSizeHeight)
{
print("then we are at the end")
// then we are at the end
}
}