2010-12-18 3 views
5

Я UIScrollView с pagingEnabled установлен в YES, и программно прокручивать его содержимое донизу:UIScrollView: однократное нажатие прокручивает его наверх

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

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

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

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

Timur.

ответ

1

Это кажется ошибка:

UIScrollView doesn't remember the position

Я испытал это на прошивке 4.2 (Simulator) и проблема остается.

+0

Спасибо, поэтому я опубликовал обходной путь ниже, который мне помог. – indexless

0

Когда прокручивая Scrollview я предложил бы использовать

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

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

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

+0

На другой заметке, может быть, я неверно истолковал вопрос: D – Accatyyc

+0

Accatyyc, спасибо за ответ. Я заменил setContentOffset: с соответствующим вызовом scrollRectToVisible: call, но, к сожалению, это не устранило проблему. – indexless

3

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

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

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

-(void) scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (scrollView.pagingEnabled == YES) 
    { 
     if ([scrollView scrolledToBottom] == YES) 
      scrollView.pagingEnabled = NO; 
    } 
    else 
    { 
     if ([scrollView scrolledToBottom] == NO) 
      scrollView.pagingEnabled = YES; 
    } 
} 
+0

Спасибо! Я упростил код для моего дела (прокрутите вправо) до одной строки. Проверьте мой ответ ниже: – Tomasz

4

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

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

Если вид свитка был (скажем) 460 пикселей в высоту с областью контента 920, вам нужно будет установить содержание смещения 0 или 460, если вы хотите, чтобы избежать «прокрутки к началу "нажмите.

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

+0

wlach, спасибо! Но когда у вас есть контент с высотой, которая не кратная высоте кадра, вы не получите правильное поведение, не так ли? :) – indexless

+0

Не уверен, но почему вы включили пейджинг, если контент не кратен высоту кадра? – wlach

5

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

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

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

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

Смежные вопросы