UIScrollView, доступ к нижней части прокрутки
Я знаю, что документация Apple имеет следующий метод делегирования:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; // called when scroll view grinds to a halt
Однако это не обязательно означает, что вы находитесь внизу. Причина, если вы используете свой палец, прокрутите немного, затем он замедляется, но вы фактически не находитесь в нижней части своего вида прокрутки, а затем его вызываете. В основном я хочу, чтобы стрелка показывала, что в моем представлении прокрутки больше данных, а затем исчезает, когда вы находитесь внизу (например, когда он отскакивает). Спасибо.
Ответы
Ответ 1
Я думаю, что вы могли бы сделать это, чтобы проверить, что ваша точка contentOffset
находится внизу contentSize
. Таким образом, вы могли бы сделать что-то вроде:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
float bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height;
if (bottomEdge >= scrollView.contentSize.height) {
// we are at the end
}
}
Вероятно, вам также понадобится отрицательный случай, чтобы показать свой индикатор, когда пользователь прокручивает резервную копию. Вы также можете добавить некоторые дополнения к этому, чтобы, например, вы могли скрыть индикатор, когда пользователь находится рядом с нижним, но не совсем внизу.
Ответ 2
Итак, если вы хотите, чтобы это было быстро, вот вы:
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
}
}
Ответ 3
Я думаю, что ответ @bensnider правильный, но не слишком. Из-за этих двух причин
1. - (void)scrollViewDidScroll:(UIScrollView *)scrollView{}
Этот метод будет вызывать непрерывно, если мы проверим if (bottomEdge >= scrollView.contentSize.height)
2. В этом случае, если мы идем на ==
, проверьте это условие на два раза.
- (i), когда мы будем прокручивать вверх, когда конец прокрутки приближается к нижнему краю
- (ii) Когда scrollview отскакивает назад, чтобы сохранить свою собственную позицию.
Я считаю, что это более точно.
Очень мало случаев, что это кодирование действительно и в два раза. Но пользователь не встретит этого.
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.y == roundf(scrollView.contentSize.height-scrollView.frame.size.height)) {
NSLog(@"we are at the endddd");
//Call your function here...
}
}
Ответ 4
Принятый ответ работает только в том случае, если нижнее значение contentInset
неотрицательно. Небольшая эволюция рассмотрит нижнюю часть contentInset
независимо от ее знака:
CGFloat bottomInset = scrollView.contentInset.bottom;
CGFloat bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height - bottomInset;
if (bottomEdge == scrollView.contentSize.height) {
// Scroll view is scrolled to bottom
}
Ответ 5
На самом деле, вместо того, чтобы просто вводить код @bensnider в scrollViewDidScroll, этот код (написанный в Swift 3) будет лучше по производительности:
func scrollViewDidEndDragging(_ scrollView: UIScrollView,
willDecelerate decelerate: Bool) {
if !decelerate {
checkHasScrolledToBottom()
}
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
checkHasScrolledToBottom()
}
func checkHasScrolledToBottom() {
let bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height
if bottomEdge >= scrollView.contentSize.height {
// we are at the end
}
}
Ответ 6
Работает в Swift 3
:
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.contentOffset.y == (scrollView.contentSize.height - scrollView.frame.size.height) {
loadMore()
}
}
Ответ 7
Посмотрите, какие элементы отображаются в UIView, используя что-то вроде indexPathsForVisibleRows
, и если ваша модель имеет больше элементов, чем показано, поместите стрелку внизу.