UIScrollView: одним нажатием прокручивает его вверх - PullRequest
5 голосов
/ 19 декабря 2010

У меня UIScrollView с pagingEnabled, установленным в YES, и программно прокручивает его содержимое до дна:

CGPoint contentOffset = scrollView.contentOffset;
contentOffset.y = scrollView.contentSize.height - scrollView.frame.size.height;
[scrollView setContentOffset:contentOffset animated:YES];

оно прокручивается успешно, но после этого при однократном нажатии его содержимое прокручивается вверх, чтобы сместить егокак раз перед тем, как прокрутится вниз.Это происходит только тогда, когда я программно прокручиваю содержимое scrollView вниз и затем нажимаю.Когда я прокручиваю до любого другого смещения и затем нажимаю, ничего не происходит.

Это определенно не то, что я хотел бы получить.Как это исправить?

Большое спасибо заранее!

Тимур.

Ответы [ 5 ]

5 голосов
/ 06 мая 2013

Этот небольшой взлом предотвращает прокрутку UIScrollView при нажатии.Похоже, это происходит, когда в представлении прокрутки включена подкачка.

В делегате UIScrollView добавьте этот метод:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    scrollView.pagingEnabled = self.scrollView.contentOffset.x < (self.scrollView.contentSize.width - self.scrollView.frame.size.width);
}

Это отключает подкачку, когда представление прокрутки достигает правого края в горизонтальномпрокрутка (мой вариант использования, вы можете легко адаптировать его к другим направлениям).

4 голосов
/ 21 декабря 2010

Я только что выяснил, что вызывает эту проблему и как ее избежать. Если для pagingEnabled в представлении с прокруткой установлено значение YES, необходимо установить для contentOffset значение, кратное видимому размеру представления с прокруткой (т. Е. Вы должны находиться на границе подкачки).

Конкретный пример:

Если ваш вид прокрутки был, скажем, 460 пикселей в высоту с областью содержимого 920, вам нужно было бы установить смещение содержимого на ЛИБО 0 или 460, если вы хотите избежать проблемы «прокрутка к началу при нажатии».

В качестве бонуса, конечный результат, вероятно, будет выглядеть лучше, поскольку ваш вид прокрутки будет выровнен по границам подкачки. :)

3 голосов
/ 20 декабря 2010

Следующий обходной путь помог (предположим, что пользователь расширяет UIScrollView категорией, поэтому «self» ссылается на его экземпляр):

-(BOOL) scrolledToBottom
{
    return (self.contentSize.height <= self.frame.size.height) ||
           (self.contentOffset.y == self.contentSize.height - self.frame.size.height);
}

Затем иногда нужно отключить pagingEnabled, просто в той позициигде вид прокрутки достигает своего дна.В делегате (pagingEnabled изначально включен, так как проблема возникает только тогда, когда он включен):

-(void) scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.pagingEnabled == YES)
    {
        if ([scrollView scrolledToBottom] == YES)
            scrollView.pagingEnabled = NO;
    }
    else
    {
        if ([scrollView scrolledToBottom] == NO)
            scrollView.pagingEnabled = YES;
    }
}
1 голос
/ 19 декабря 2010

Это похоже на ошибку:

UIScrollView не запоминает позицию

Я проверил это на iOS 4.2 (Симулятор), и проблема остается.

0 голосов
/ 19 декабря 2010

При прокрутке ScrollView я бы предложил использовать

[scrollView scrollRectToVisible:CGRectMake(0,0,1,1) animated:YES];

Где прямоугольник - это позиция, за которой вы находитесь. (В этом случае прямоугольник будет вершиной прокрутки).

Изменение смещения содержимого не является правильным способом прокрутки прокрутки.

...