2009-09-14 41 views
4

我的UIScrollView的UIView的包含的一個實例的實例。 UIView只是一個UIImageView實例水平數組的容器。 - 縮放由UIScrollView和UIScrollViewDelegate提供。我想約束縮放只發生在水平軸上,根本沒有垂直縮放。我如何做到這一點?UIView。我如何限制擴展到一個尺寸只有

有沒有一種方式,例如,子類的UIView並重寫適當的方法,以防止垂直縮放?我喜歡這種方法,但我就重寫該方法和什麼重寫的方法應該真正做到不清楚。

乾杯, 道格

+0

所以你想水平拉伸圖像?如果你不放大垂直軸,那麼圖像將變得歪斜 – coneybeare 2009-09-14 18:21:03

+0

是的。那就是我所追求的。 – dugla 2009-09-14 18:49:10

回答

14

與我在this answer中描述的類似,您可以創建一個UIView子類並重寫-setTransform:accessor方法來調整UIScrollView將嘗試應用到您的UIView的轉換。設置此UIView的託管您的內容子視圖,使之成爲的UIScrollView的子視圖。

在您的覆蓋-setTransform:中,您需要接受UIScrollView想要應用並進行調整的轉換,以便縮放僅在一個方向上生效。從documentation on how CGAffineTransform matrices are constructed,我相信下面的實現應該限制你的縮放只是沿水平方向:

- (void)setTransform:(CGAffineTransform)newValue; 
{ 
CGAffineTransform constrainedTransform = CGAffineTransformIdentity; 
constrainedTransform.a = newValue.a; 
[super setTransform:constrainedTransform]; 
} 
+1

這限制了Y軸,但UIScrollView的行爲 - 在捏 - 期間,就好像兩個都被轉換了。這是內容偏移量和內容大小增加,以在兩個軸上進行縮放。有關我可能錯過的任何想法? – 2015-06-16 20:38:42

1

使用OS 3.0,你可以告訴變焦可放大到了滾動一個矩形。我在檢測水龍頭的邏輯中有這個。

CGRect zoomRect = [self zoomRectForScale:newScale withCenter:CGPointMake(tapPoint.x, tapPoint.y) inScrollView:scrollView]; 
[scrollView zoomToRect:zoomRect animated:YES]; 

的爲另一部分,你將不得不通過舒展的新框架具有與原始比例圖像的意見,並在同一個中心點居中。爲此,您可以在動畫定時一樣的縮放動畫,使它看起來正確的,但我認爲這將是做到這一點的唯一途徑。

+0

感謝你的這個coneybeare。所以我相信我理解這個方法的用法,如果我使用scrollview.bounds作爲矩形,我會假設將視圖的尺寸固定爲滾動視圖的尺寸,是否正確? 乾杯, Doug – dugla 2009-09-14 21:43:32

+1

coneybeare, 實際上,從你的代碼片段看起來你正在處理所有縮放,因爲你正在調用zoomToRect:自己動畫,而不是簡單地覆蓋它。我寧願讓UIScrollView處理所有這些,只需插入我的約束。你會接近要求我實現我自己的平移/縮放功能。你能否提供更多的啓發。 乾杯, Doug – dugla 2009-09-14 22:05:08

1

scrollViewDidZoom:,調整內容視圖的基礎上zoomScale變量,重置zoomScale到1.0,然後在內容視圖上執行setNeedsDisplay。在內容視圖的drawRect:中處理實際縮放(無論您想要的方向)。

醜陋的細節:

  1. 當變焦過程中,該UIScollView改變contentOffsetcontentScale,所以在scrollViewWillBeginZooming拯救那些前值:scrollViewDidZoom:所以您可以根據變焦自己計算新的contentOffset

  2. 由於改變zoomScale將立即觸發另一scrollViewDidZoom:,必須設置重置zoomScale前BOOL(後清零)。在scrollViewDidZoom:開始時測試BOOL,如果爲true,則返回。

  3. 您可能需要抑制scrollViewDidScroll:而變焦過程中(測試BOOL;設置在scrollViewWillBeginZooming:scrollViewDidEndZooming清除:),所以你自己contentOffsets被同時放大使用正在處理。