2009-09-18 55 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在那裏工作。但在我的舊應用程序中,我似乎無法讓它做任何事情。

我可以使scrollView滾動setContentOffset:,但那不是我想要的。

此scrollView及其內容在IB中由筆尖定義並與IBOutlet一起使用。我用我的應用程序來處理滾動視圖的唯一代碼

[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

它仍然就像我要滾動的RECT到已經可見和不需要滾動。不知道這是怎麼回事。這只是最糟糕的事情。好像這樣一件容易的事情來解決...

附錄#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]; 
} 

其他一切關於這個滾動視圖正常工作,但scrollRectToVisible。爲什麼?!?任何野生猜測?

回答

99

一個多月後,我終於明白了。雖然上面的替代方案運行良好,但它一直在困擾我,我不得不最終弄清楚。原來,這是一個愚蠢的錯誤。

這裏是原來的代碼在我viewDidLoad中,我在那裏建立了滾動:

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

滾動型高度或寬度的值不能爲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請將其設置爲有效值,因此最好給它一個具體的值

5

您可能想要檢查並查看scrollView的delaysContentTouches屬性設置爲NO

如果您在scrollView的子視圖中觸摸方法scrollRectToVisiblesetContentOffset,那麼您的scrollView可能會通過延遲觸摸來控制事物。

因此,請確保在scrollView中設置了以下內容。

scrollView.delaysContentTouches = NO; 

您將很可能能夠將帶有或不帶有動畫的scrollView移動到YES。

0

有點晚,但我有同樣的問題。雖然我絕對讓我的scrollview的內容大小設置正確 - 甚至對高度值也是如此。即使經過廣泛檢查以驗證幀和內容大小 - 仍然無法正常工作。我不得不調整「邊界」框架高度,然後一切都很好。

0

我有這個問題相同的症狀.. scrollRectToVisible不按預期工作。我的問題是故事板上的滾動視圖有一個模糊的約束問題。一旦這個問題得到解決,通話就可以正常進行當scrollRectToVisible調用沒有按照預期工作時,檢查是另一回事。