UIScrollView работает как положено, но scrollRectToVisible: ничего не делает - PullRequest
60 голосов
/ 18 сентября 2009

Я использовал 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 и его содержимое определены в кончике IB и используются с IBOutlet. Единственный код, который я использую в своем приложении для обработки scrollView, это

 [scrollView setContentSize:CGSizeMake(scrollView.contentSize.width, imageView.frame.size.height)];

(меня интересует только вертикальная прокрутка, а не горизонтальная).

Кто-нибудь сталкивался с такой проблемой?

Я сравнил атрибуты scrollView в обоих приложениях, и они идентичны.

ДОПОЛНЕНИЕ:

Мой кадр scrollViews: 0,000000 0,000000 480,000000 179,000000

Мой scrollViews contentSize: 0.000000 324.000000

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

ADDENDUM # 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. ЗАЧЕМ?!? Какие-нибудь дикие догадки?

Ответы [ 8 ]

110 голосов
/ 26 ноября 2009

Спустя месяц, и я наконец понял это. Хотя альтернатива, описанная выше, сработала хорошо, она доставляла мне много неприятностей, и мне, наконец, пришлось с ней разобраться. Оказывается, это была какая-то глупая ошибка.

Вот старый код в моем viewDidLoad, где я настроил 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)];

Надеюсь, это поможет кому-то там. Я определенно потратил слишком много времени, пытаясь отладить это.

46 голосов
/ 02 октября 2009

Да, у меня не было успеха с scrollRectToVisible:animated:, но setContentOffset:animated: всегда работает для меня. Из любопытства, почему вы не хотите использовать setContentOffset:animated:? Вроде бы правильное решение.

5 голосов
/ 15 февраля 2013

Возможно, вы захотите проверить и увидеть, что свойство delaysContentTouches scrollView установлено в NO.

Если вы вызываете метод scrollRectToVisible или setContentOffset от прикосновения в рамках подпредставления вашего scrollView, то ваш scrollView может удерживать вещи, задерживая касания.

Итак, убедитесь, что вы установили следующее в scrollView.

scrollView.delaysContentTouches = NO;

Скорее всего, вы сможете перемещать scrollView с анимацией и без нее, установленной в YES.

1 голос
/ 01 июля 2011

У меня было так, и это не сработало

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, someKnownValue);

Я просто менял высоту contentSize, так что я не думал, что это доставит мне какие-то проблемы, но это ...

пришлось изменить это на

scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue);

Оказывается, scrollView.contentSize.width не обязательно установлен на допустимое значение с самого начала, поэтому лучше дать ему конкретное значение

0 голосов
/ 15 февраля 2019

Для меня проблема заключалась в том, что ограничение в подпредставлении не было явным. Убедитесь, что все ограничения в вашем контенте установлены, даже если они явно не нужны для макета.

0 голосов
/ 04 января 2017

У меня были те же симптомы, что и у этой проблемы .. scrollRectToVisible не работал как положено. Моя проблема заключалась в том, что у прокрутки на раскадровке была неоднозначная проблема с ограничениями. Как только это было исправлено, звонок работал просто отлично. Это что-то еще, чтобы проверить, когда вызов scrollRectToVisible не работает, как предполагалось.

0 голосов
/ 31 мая 2013

Немного опоздал к игре, но у меня возникла та же проблема. Хотя я абсолютно правильно установил размер контента в scrollview - даже слишком сильно для значения высоты. Даже после обширных проверок для проверки фреймов и размеров контента - все равно ничего не получалось. Мне пришлось отрегулировать высоту рамки "bounds", тогда все работало отлично.

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

Предложенное выше решение может по-прежнему выдавать ошибку, если вы не установили рамку для «clefScrollView».

Если решение, указанное выше, все еще имеет ту же проблему, убедитесь, что вы инициализировали свой кадр scollView (в данном случае clefScrollView), прежде чем настраивать представление содержимого.



    clefScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,450)];

    [clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];



Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...