2012-02-03 50 views
21

現在我有一個視圖在UIScrollView之外。出於很多原因,它不能簡單地放在scrollview中。所以現在我所做的是,隨着UIScrollView縮放/平移,我更新了我的其他輔助視圖。我要進入的唯一問題是,zoomscale值不會在視圖回彈到最小或最大比例時調整。如何獲得這個價值,而它的動畫回來的任何建議?UIScrollView的zoomScale屬性在縮放彈跳時不會更新

示例代碼:

self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, appSize.width, appSize.height)]; 
self.scrollView.contentSize = CGSizeMake(appSize.width * 2, appSize.height * 2); 

self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite; 
self.scrollView.delegate = self; 
self.scrollView.bounces = YES; 
self.scrollView.bouncesZoom = YES; 
self.scrollView.alwaysBounceHorizontal = YES; 
self.scrollView.alwaysBounceVertical = YES; 
self.scrollView.showsHorizontalScrollIndicator = YES; 
self.scrollView.showsVerticalScrollIndicator = YES; 

self.scrollViewZoomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 
                    appSize.width * 2, 
                    appSize.height * 2)]; 
[[self scrollView] addSubview:self.scrollViewZoomView]; 

float minZoomScale = 2.0f; 

self.scrollView.minimumZoomScale = minZoomScale; 
self.scrollView.maximumZoomScale = 1.0f; 
self.scrollView.zoomScale = self.scrollView.minimumZoomScale; 

,然後自我

-(void) scrollViewDidZoom:(UIScrollView *)scrollView { 
    float scale = [scrollView zoomScale]; 
    [self updateAuxViewScale:scale]; 
} 
+0

你就不能動畫輔助以期最小/最大規模的時候'scrollViewDidEndZooming:withView:atScale:'叫?我認爲「反彈」動畫具有固定的持續時間。 – omz 2013-04-03 13:24:15

回答

4

由於this answer可以清楚地看到一個可以使用presentationLayer,以獲得正確的值。 我創建了一個UIScrollViewcategoryzoomScale,contentOffsetcontentSize添加了特殊的獲取者,即使UIScrollView正在動畫,它也會返回正確的值。

你可以在這裏找到回購:https://github.com/bddckr/BDDRScrollViewExtensions

+1

爲我節省了大量的時間。做得好。 – fionbio 2013-08-07 01:50:45

+0

我正在使用這種方法,但我經常發現,表示層的最終值與他們應該的值不匹配。就好像它停下來一樣。 – Benjohn 2015-08-11 15:17:18

2

你應該使用不同的方法UIScrollViewDelegate。

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { 
    // Your code here 
    float scale = [scrollView zoomScale]; 
    [self updateAuxViewScale:scale]; 
} 

根據該文檔:https://developer.apple.com/library/ios/#documentation/uikit/reference/uiscrollviewdelegate_protocol/Reference/UIScrollViewDelegate.html

「的渦旋視圖還調用之後的任何這種方法‘反彈’動畫」。

+5

我完全忘記了這篇文章,直到現在。我一直在處理它,但希望在發佈前解決它。 問題是,我可以確定用戶正在進行縮放時的縮放比例,以及「跳動」動畫完成時的縮放比例,但這是我希望轉發的實際動畫。在縮放反彈動畫中,我希望知道CURRENT縮放的內容 - 即動畫中特定間隔的縮放級別。 – 2012-04-03 21:07:30

+1

我真的很想解決這個問題。我現在正在考慮KVO觀看視圖的presentationLayer,但是我也沒有得到任何回調。很想解決這個問題。 – bobmoff 2012-10-11 20:40:56

-2

按我的瞭解,如果你想知道當前的縮放級別,你應該使用以下的委託方法的UIScrollView

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale 
{ 

     NSLog(@"Zoomscale %f",scale); 

} 

希望這將是對你有用。

享受編程!

+0

該解決方案實際上並不能解決我的問題。我的問題是,我想知道當前縮放比例是在動畫的反彈縮放部分。我試過每一個委託方法,以及KVO都無濟於事。 – 2013-04-02 13:35:53

+0

哦..爲什麼如此。我只在我的應用程序中使用此委託方法做了同樣的事情。 – 2013-04-02 13:37:14

+0

因爲我的視圖隱藏在一個無形的UIScrollView後面。我使用UIScrollView作爲它的物理特性 - 所以我將比例因子從UIScrollView傳遞到輔助視圖。這就是爲什麼我需要知道縮放比例是多少,即使是從動畫反彈。 – 2013-04-02 13:46:42

1

好的,我想我可能找到了一些能夠幫助你的東西。在這個相關的線程In iOS 4.0, why does UIScrollView zoomToRect:animated: not trigger the scrollViewDidScroll or scrollViewDidZoom delegates while animating?中,有兩個答案可能對你有用。

  1. https://stackoverflow.com/a/15512253/1011213
  2. https://stackoverflow.com/a/7553969/1011213

就個人而言,我想我會放棄第一個解決方案了一槍。希望我明白這個問題,這是有幫助的。如果不是......道歉和最幸福的編碼!

5

變焦的回彈是一種動畫,因此即使動畫仍在運行,屬性zoomScale也立即成爲動畫的目標值。如果你想申請的是滾動視圖有另一種觀點相同的縮放比例,這裏有一個方法來檢索它:

  1. -scrollViewDidScroll:檢查內容視圖是否具有動畫。
  2. 如果沒有動畫,只設置新的縮放比例。
  3. 如果有動畫,請獲取其中一個動畫的持續時間(持續時間應該都相等),然後使用該持續時間將您的視圖動畫到新的縮放比例。

該方法不夠高雅,但它的工作原理。下面是一些代碼,讓你開始:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    CGFloat zoomScale = _scrollView.zoomScale; 

    CALayer *layer = _contentView.layer; 
    NSArray *animationKeys = [layer animationKeys]; 

    if (animationKeys.count == 0) { 
     // set zoomScale on target view 
    } else { 
     CFTimeInterval duration = 0.0; 
     for (NSString *animationKey in animationKeys) { 
      CAAnimation *animation = [layer animationForKey:animationKey]; 
      duration = animation.duration; 
      break; 
     } 
     // easeInEaseOut is the default animation when the zoom bounces 
     [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
      // set zoomScale on target view 
     } completion:nil]; 
    } 
} 
+0

這看起來很有希望。你能解釋爲什麼你存儲_previousZoomScale我沒有看到它在任何地方使用。 – combinatorial 2013-04-03 15:54:21

+0

好點,在我的測試項目中,我存儲了舊值和新值,但如果將縮放設置爲另一個對象,則只需要新值。我會適應可能相應的回答。 – 2013-04-03 16:44:58