2012-05-01 149 views
6

的減速我創建一個大的,360度,全景圖像的iPhone應用程序。全景圖是UIScrollView中的CATiledLayer。無限滾動 - setContentOffset:停止的UIScrollView

我正試圖在圖像上實現無限滾動(僅限水平方向)。和setContentOffset:動畫:我已經通過繼承的UIScrollView和實施setContentOffset做到了這一點,這完美的作品,當用戶拖動滾動視圖。但是,當用戶擡起手指並且滾動視圖正在減速時,更改contentOffset會使減速立即停止。

- (void)setContentOffset:(CGPoint)contentOffset 
{  
    CGPoint tempContentOffset = contentOffset; 

    if ((int)tempContentOffset.x >= 5114) 
    { 
     tempContentOffset = CGPointMake(1, tempContentOffset.y); 
    } 
    else if ((int)tempContentOffset.x <= 0) 
    { 
     tempContentOffset = CGPointMake(5113, tempContentOffset.y); 
    } 

    [super setContentOffset:tempContentOffset];  
} 

有什麼辦法來改變contentOffset不影響減速?

建議使用here覆蓋setContentOffset :(不是setContentOffset:animated :)解決了這個問題,但我似乎無法得到它的工作。

我也試過scrollRectToVisible:動畫:沒有成功。

任何想法如何解決這個問題將不勝感激。謝謝!

編輯:

代碼scrollViewDidScroll:

-(void)scrollViewDidScroll:(PanoramaScrollView *)scrollView 
{ 
    [panoramaScrollView setContentOffset:panoramaScrollView.contentOffset]; 
} 

我也試過這樣:

-(void)scrollViewDidScroll:(PanoramaScrollView *)scrollView 
{ 
    CGPoint tempContentOffset = panoramaScrollView.contentOffset; 

    if ((int)tempContentOffset.x >= 5114) 
    { 
     panoramaScrollView.contentOffset = CGPointMake(1, panoramaScrollView.contentOffset.y); 
    } 
    else if ((int)tempContentOffset.x == 0) 
    { 
     panoramaScrollView.contentOffset = CGPointMake(5113, panoramaScrollView.contentOffset.y); 
    } 
} 

回答

2

我解決了問題與解決方法。我創建了3個全景的全寬全景圖像(犯規,因爲我使用的是CATiledLayer影響性能太多),以及decelerationRate屬性設置爲UIScrollViewDecelerationFast。因此,用戶無法減速停止之前太遠滾動,如果減速左或右全景圖像停止,內容偏移再變回到中間圖像。這具有無限滾動的外觀,並且這是我可以提出的最佳解決方案。

+0

爲了避免需要'UIScrollViewDecelerationFast',你可以使'contentSize'非常大,從你的三寬度內容視圖和視點開始,並安排內容視圖在滾動時重新定位;那麼,當減速停止時,將所有的東西都放回到中間。 – hatfinch

+0

@hatfinch感謝您的評論。這幾乎是我最終做的,但我不能100%確定你的意思是「安排在滾動時重新定位內容視圖」。你能解釋這將如何工作? –

+0

它會像您所描述的方法一樣工作,除非不削弱減速以確保用戶無法滾動三倍寬度全景,而是移動全景。因此,對於「內容視圖」ABC,您在滾動視圖中有xxxABCxxx(x僅爲空白),並且當用戶滾動例如在左側滾動一個圖像寬度後,移動內容視圖,以便擁有xxABCxxxx。除了你用這麼多'x'來做它,他們必須非常慎重地試圖達到邊緣。那有意義嗎? – hatfinch

0

我會嘗試使用UIScrollViewDelegate協議方法:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 

,它被稱爲當用戶滾動(即使它的減速)

和裏面我會改變contentoffset

+0

的scrollViewDidScroll方法是其中我打電話如上所示的方法setContentOffset。我也嘗試直接在scrollViewDidScroll中設置contentOffset,但沒有運氣。 每當設置內容偏移時,減速立即停止。下面的日誌輸出顯示內容偏移更改,然後觸發scrollViewDidEndDecelerating。 '(62.000000 0.000000)(22.000000 0.000000)(0.000000 0.000000)(5113.000000 0.000000)scrollViewDidEndDecelerating' –

+0

怎麼樣?發佈你的scrollViewDidScroll的代碼... – meronix

0

我最近在做同樣的無限滾動和意外找到了解決辦法:

只需設置bounces=YESalwaysBounceHorizontal=YES或/和alwaysBounceVertical=YES(取決於方向滾動即可)。

就是這樣,這對我很有用。:)

1

代替

[scrollView setContentOffset:tempContentOffset]; 

使用

scrollView.contentOffset = tempContentOffset; 
相關問題