2009-09-18 2 views
54

Я использовал UIScrollView раньше, и теперь использую его, и у меня никогда не было проблемы. Теперь я добавляю его в старое приложение, и, хотя он работает так, как ожидалось (я могу посмотреть содержимое, прокрутить его пальцем, все границы и размеры настроены правильно, поэтому в содержимом нет пустого места и т. Д. .) Я просто не могу получить scrollToRectVisible для работы. Я даже упрощен вызов, так что он просто перемещается в положение 0,0:UIScrollView работает так, как ожидалось, но scrollRectToVisible: ничего не делает

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

или переместить его в 0,200:

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

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

Я могу сделать свиток прокруткиView с setContentOffset:, но это не то, что я хочу.

Этот прокруткиПросмотр и его содержимое определены в наконечнике 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. ЗАЧЕМ?!? Какие-то дикие догадки?

ответ

99

Более месяца спустя, и я, наконец, понял это. В то время как альтернатива выше работала хорошо, она прослушивала меня, и мне пришлось наконец разобраться в этом. Оказывается, это была глупая ошибка.

Вот старый код в моем 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)]; 

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

+0

Спасибо! Я тоже этим занимался (я устанавливал высоту, но не ширину). –

+3

Это НЕ совсем правильно - c.f. Ответ Ориона ниже (у меня была отличная от нуля ширина/высота, это не «0», что вызывает проблему ...) – Adam

+0

Я сделал это аналогичным образом, но все же scrollRectToVisible не работает. Его работа в симуляторе, но не на устройстве. Пожалуйста помоги. –

43

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

+3

К сожалению, setContentOffset будет прокручиваться до точки, независимо от того, она уже видна или нет. Я мог бы выполнить дополнительную работу по определению того, является ли точка видимой или нет, однако мне все еще интересно, почему scrollRectToVisible не работает, когда я вижу, что он работает в моем собственном примере и других образцах в сети. Я должен делать что-то не так, но с тремя или четырьмя строками кода для scrollView я не вижу, что ?! – mahboudz

0

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

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



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

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



1

я имел это так и не получилось

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

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

пришлось изменить его к этому

scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue); 

оказывается scrollView.contentSize.width не necessari ly установлено в действительное значение из get go, поэтому лучше дайте ему определенное значение

5

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

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

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

scrollView.delaysContentTouches = NO; 

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

0

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

0

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

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