Подтвердить что ты не робот

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. ЗАЧЕМ?!? Любые дикие догадки?

4b9b3361

Ответ 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 не работает должным образом.