UIScrollView работает так, как ожидалось, но scrollRectToVisible: ничего не делает
Я использовал UIScrollView
раньше, и теперь я использую его, и у меня никогда не было проблемы. Теперь я добавляю его в старое приложение, и, хотя он работает так, как ожидалось (я могу посмотреть содержимое, прокрутить его пальцем, все границы и размеры настроены правильно, поэтому в содержимом нет пустого места и т.д..) Я просто не могу заставить scrollToRectVisible
работать. Я даже упростил вызов, чтобы он просто переместился в положение 0,0:
[scrollView scrollRectToVisible:CGRectMake(0, 0, 10, 10) animated:YES];
или переместите его на 0,200:
[scrollView scrollRectToVisible:CGRectMake(0, 200, 10, 10) animated:YES];
Я даже сделал быстрое приложение, чтобы проверить это, и я могу заставить scrollRectToVisible
работать там, как я ожидаю. Но в моем старом приложении я не могу заставить ничего сделать.
Я могу прокрутить scrollView с помощью setContentOffset:
, но это не то, что я хочу.
Этот scrollView и его содержимое определяются в nib by IB и используются с IBOutlet. Единственный код, который я использую в своем приложении для обработки прокрутки, -
[scrollView setContentSize:CGSizeMake(scrollView.contentSize.width, imageView.frame.size.height)];
(меня интересует только вертикальная прокрутка, а не горизонтальная).
Кто-нибудь сталкивался с такой проблемой?
Я сравнивал атрибуты scrollView в обоих приложениях, и они идентичны.
ДОПОЛНЕНИЕ:
Мой кадр scrollViews: 0.000000 0.000000 480.000000 179.000000
My scrollViews contentSize: 0.000000 324.000000
Он по-прежнему действует как прямоугольник, который я хочу прокрутить до уже видимого, и прокрутка не требуется. Не уверен, что это то, что происходит. Это просто самое страшное. Кажется, такая легкая вещь для решения...
ДОБАВЛЕНИЕ № 2:
Вот как я делаю это без scrollRectToVisible
:
CGPoint point = myRect.origin;
if (![clefScrollView pointInside:point withEvent:nil]) {
point.x = 0;
if (point.y > clefScrollView.contentSize.height - clefScrollView.bounds.size.height)
point.y = clefScrollView.contentSize.height - clefScrollView.bounds.size.height;
[clefScrollView setContentOffset:point animated: YES];
}
Все остальное в этом scrollView работает так, как ожидалось, но scrollRectToVisible
. ЗАЧЕМ?!? Любые дикие догадки?
Ответы
Ответ 1
Спустя месяц я наконец понял это. В то время как альтернатива выше работала хорошо, она прослушивала меня, и мне пришлось наконец разобраться в этом. Оказывается, это была глупая ошибка.
Здесь старый код в моем представленииDidLoad, где я настроил scrollView:
[clefScrollView setContentSize:CGSizeMake(clefScrollView.contentSize.width, clefView.frame.size.height)];
Значение высоты или ширины scrollView не может быть 0! Я думаю, что это прошло мимо меня, потому что я предполагал, что размеры ScrollView начинаются с допустимого размера, и мне не хватало того факта, что одно измерение было нулевым!
Это работает:
[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];
Надеюсь, что это поможет кому-то. Я определенно потратил слишком много времени, пытаясь отладить это.
Ответ 2
Да, у меня не было успеха с scrollRectToVisible:animated:
, но setContentOffset:animated:
всегда работает для меня. Из любопытства, почему вы не хотите использовать setContentOffset:animated:
? Кажется, это правильное решение.
Ответ 3
Возможно, вы захотите проверить, что для свойства scrollView delaysContentTouches
установлено значение NO
.
Если вы вызываете метод scrollRectToVisible
или setContentOffset
от касания в подзоне вашего scrollView, ваш scrollView может задерживать вещи, задерживая прикосновения.
Итак, убедитесь, что вы установили следующее в свой scrollView.
scrollView.delaysContentTouches = NO;
Скорее всего, вы сможете перемещать scrollView с анимацией без анимации и без нее.
Ответ 4
У меня было так, и это не сработало
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, someKnownValue);
Я просто менял высоту contentSize
, поэтому я не думал, что это вызовет у меня какие-то проблемы, но это произошло...
пришлось изменить его на
scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue);
получается scrollView.contentSize.width
не обязательно устанавливается на допустимое значение из get go, поэтому лучше дать ему определенное значение
Ответ 5
Предлагаемое решение выше может по-прежнему выдавать ошибку, если вы не установили кадр для "clefScrollView".
Если вышеприведенное решение используется и по-прежнему имеет ту же проблему, убедитесь, что вы инициализировали кадр scollView (в данном случае clefScrollView) до установки содержимого.
clefScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,450)];
[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];
Ответ 6
Немного поздно в игре, но у меня была такая же проблема. Хотя я абсолютно правильно установил размер содержимого прокрутки - даже слишком сильно для значения высоты. Даже после тщательных проверок для проверки размеров кадров и содержимого - все еще не работал. Мне пришлось корректировать высоту кадра "границы", тогда все отлично работало.
Ответ 7
У меня были те же симптомы, что и эта проблема... scrollRectToVisible не работал должным образом. Моя проблема заключалась в том, что в scrollview на раскадровке была проблема двусмысленного ограничения. Как только это было исправлено, звонок работал нормально. Это еще что-то проверить, когда вызов scrollRectToVisible не работает должным образом.