2011-06-13 121 views
2

我已經看到了stackoverflow,但無法找到完全回答我的問題的答案。如果我錯過了某些東西,請將我指向正確的問題。UIScrollView通過觸摸垂直滾動並以編程方式水平方向

這裏是我的方案 -

我本來在我的垂直窗口大小設置的情況下,所以很容易對我來說,完全限制滾動簡單地這樣做 -

CGRect scrollContainer = CGRectMake(0, 0, 320, 440); 
self.baseView = [[UIScrollView alloc] initWithFrame:scrollContainer]; 
self.baseView.contentSize = CGSizeMake(6400, 440); 
self.baseView.bounces = NO; 
self.baseView.pagingEnabled = NO; 
self.baseView.scrollEnabled = NO; 

基於手機的移動,當時我能夠以編程方式滾動 -

CGPoint scrollOffset = CGPointMake(x*20, 0); 
[self.baseView setContentOffset:scrollOffset]; 

在我的新的要求,垂直含量急劇增加,所以我會甲肝E中的contentSize像這樣

self.baseView.contentSize = CGSizeMake(6400, 4400); 

我還是要編程水平滾動,但給用戶通過觸摸ONLY垂直滾動的能力。所以,我假設我必須說scrollEnabled = YES。但是這可以讓用戶在兩個方向上滾動。

我是否必須捕獲觸摸事件並覆蓋它們?我如何識別它是一個水平滾動還是一個垂直滾動?如果它的對角滾動操作會發生什麼?

在這一點上,我有點無知,所以任何輸入將不勝感激。

回答

4

您可能可以通過嵌套兩個UIScrollViews來做到這一點。

內滾動視圖將有contentSize的實際內容,其實際尺寸將爲屏幕寬度和相同的高度爲contentSize 禁用滾動功能。

外滾動視圖將它的contentSize與外滾動視圖的尺寸相同,它的實際尺寸將是啓用滾動的屏幕尺寸。

這樣,用戶可以在外部視圖上上下滾動,同時以內部視圖以編程方式控制水平偏移。

這有點複雜,但至少你不必子類。 :d

(也只會與iOS 3.0+工作),但似乎並不成爲一個問題)

[見「滾動查看編程指南適用於iOS」的「嵌套滾動視圖」一節]

+0

我不知道我明白。如果我想垂直滾動,其中一個滾動視圖的內容大小必須大於屏幕大小,對嗎?這是內在的滾動視圖還是外部? – Kal 2011-06-13 13:32:40

+0

我會在今晚試試這個,並提供反饋。欣賞答案。 innerscrollview =禁用滾動的整個內容大小。 outerscrollview.width =屏幕寬度..將innnerscrollview添加到outerscrollview併爲outerscrollview啓用屏幕交互。這聽起來是對的嗎? – Kal 2011-06-13 13:35:59

+2

@Kal內部scrollView也只有屏幕寬度寬度,但其contentSize是完整的contentSize。它的高度是contentSize.height。因此,支持觸摸的外部滾動視圖會滾動*整個內部scrollView *(它具有contentSize = innerScrollView.size),並且您可以從代碼中控制內部scrollView的水平contentOffset,因爲用戶沒有機會改變它。 – fzwo 2011-06-13 13:44:52

4

您可以使用UISwipeGestureRecognizer將一系列觸摸事件識別爲垂直或水平滑動。

// ensure that automatic scrolling is not enabled 
scrollView.scrollEnabled = NO; 

UISwipeGestureRecognizer *swipeRecognizer = [[UISwipeGestureRecognizer alloc] 
              initWithTarget:self 
              action:@selector(handleGesture:)]; 
swipeRecognizer.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown; 
[scrollView addGestureRecognizer:swipeRecognizer]; 
[swipeRecognizer release]; 

在你handleGesture:方法,現在可以適當調整scrollOffset。請閱讀UIGestureRecognizer瞭解更多詳情。

3

我也認爲兩個scrollViews是這裏的答案。如果您不想嵌套它們,請將它們的數據鏈接到控制器中:

有一個用於保存您的內容並禁止用戶交互的scrollView,我們稱之爲contentScrollView,以及頂部具有相同大小的一個不可見scrollView ,interactionScrollView。在兩者的代表控制器中,執行器

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (scrollView == interactionScrollView) 
    { 
     CGPoint offset = CGPointMake(yourProgrammaticallySetHorizontalOffset,interactionScrollView.contentOffset.y); 
     [contentScrollView setContentOffset:offset]; 
    } 
} 

您還可以通過這種方式鏈接縮放。

+0

謝謝你的回答。我今天會試一試,並提供反饋意見。 – Kal 2011-06-13 13:36:18

1

另一種可能性,因爲你可能並不真正需要的水平滾動,你只是想設置的內容的偏移:

把你的內容查看到滾動型正常,但設置了滾動的contentSize爲CGPointMake(scrollView.size.width,content.size.height)。這意味着scrollView不會水平滾動。

現在,從您的代碼中,您可以水平移動內容:content.frame = CGRectOffset(content.frame, yourPreferredOffset, 0)

我沒有測試過這個,但我知道它會工作,只需要一個scrollView。你也可以把這個框架改變成一個動畫,使它看起來像一個滾動(它是),而不是突然的內容改變。

相關問題