2012-04-26 91 views
3

我擁有兩個UIScrollViews,它們彼此重疊。兩個UIScrollViews,同步滾動

         UIView 
              | 
           -------------------------- 
           |      | 
         UIScrollView1   UIScrollView2 

我喜歡它,以下面的方式工作。如果我滾動UIScrollView2,UIScrollView1也應該滾動相同的contentOffset。它必須通過同步完成,因此使用scrollViewDidScroll不是一個選項。你們有沒有想法,怎麼辦?

源代碼

_prContentGridView = [[PRContentGridView alloc] initWithFrame:frame]; 
    _prContentGridView.minimumZoomScale = 0.25; 
    _prContentGridView.maximumZoomScale = 2.0; 
    _prContentGridView.delegate = self; 

    _prBackgroundGridView = [[PRBackgroundGridView alloc] initWithFrame:frame]; 

    [self addSubview:_prBackgroundGridView]; 
    [self addSubview:_prContentGridView]; 

委託方法

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (_prContentGridView.scrollEnabled == YES) { 
     CGPoint p = CGPointMake(scrollView.contentOffset.x - _prevousContentOffsetOfContentScrollView.x, scrollView.contentOffset.y - _prevousContentOffsetOfContentScrollView.y); 
     [_prBackgroundGridView setContentOffset:p animated:YES]; 
    } 
} 
+0

你實際使用scrollViewDidScroll試過嗎?當然我曾嘗試過 – Vladimir 2012-04-26 08:53:30

+0

。委託方法被調用得太晚,並且UIScrollView1在UIScrollView2後幾秒後停止。 – pawelropa 2012-04-26 09:00:18

+0

???它怎麼能被延遲調用?它應該在scrollview將其內容移動到新的座標之前被調用......如果它晚了,某個地方出了問題......發佈代碼 – meronix 2012-04-26 09:07:14

回答

8

使用UIScrollViewDelegate協議方法:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ 
    if (scrollView == UIScrollView1){ 
    UIScrollView2.contentOffset = scrollView.contentOffset; 
    }else{ 
    UIScrollView1.contentOffset = scrollView.contentOffset; 
    } 
} 
+0

它在兩個UIScrollViews的contentSize相同時工作,但是我的UIScrollViews有不同的contentSize。我將修改並應用您的解決方案。謝謝。 – pawelropa 2012-04-26 09:30:41

+0

好吧,我後來看到你添加了一個新的代碼和編輯器......不客氣 – meronix 2012-04-26 09:41:10

+0

看起來,使用'[UIScrollview setContentOffset:animated:]'會導致第二個滾動視圖滯後於被觸摸的那個。如果使用'[UIView animateWithDuration:animations:]'並設置'.contentOffset'屬性,它會更平滑。 ([參考答案](http://stackoverflow.com/a/11723874/168594)) – zekel 2013-05-14 03:09:08

2

你應該試試這個代碼, 先聲明IBOutlet中的.h文件中,

IBOutlet UIScrollView *FirstScrollView; 
IBOutlet UIScrollView *SecondScrollView; 

那就試試這個代碼,

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if ([scrollView isEqual: FirstScrollView]) 
    { 
      SecondScrollView.contentOffset = 
       CGPointMake(FirstScrollView.contentOffset.x, 0); 
    } 
    else 
    { 
      FirstScrollView.contentOffset = 
       CGPointMake(SecondScrollView.contentOffset.x, 0); 
    } 
}