2014-09-19 93 views
7

我的觀點是複製許多使用照片的應用程序的行爲,其中UIScrollViewUIImageView內部正在呈現它適合圖像的大小,即使此圖像較小。設置UIScrollView縮放比例以適合屏幕

我敢肯定,這不應該與UIImageView框架,但UIScrollView操縱,但如何......?


在我的代碼我有一個名爲updateZoom方法,其計算minimumZoomScale值,也將此值賦給了zoomScale財產。我想這是做數學計算的好地方,並且手動計算zoomScale

這是方法:

- (void)updateZoom { 
    float minZoom = MIN(self.view.bounds.size.width/self.imageView.image.size.width, self.view.bounds.size.height/self.imageView.image.size.height); 

    if (minZoom > 1) { 
     minZoom = 1; 
    } 

    self.scrollView.minimumZoomScale = minZoom; 
    self.scrollView.zoomScale = minZoom; 
} 

我希望有人能給我一擊上如何設置zoomScale以適應UIScrollView界限。

回答

2

要設置其適合在滾動視圖圖像大小使用該設置的minimumZoom了滾動縮放: self.scrollView.minimumZoomScale = self.scrollView.frame.size.width/ self.imageView.frame.size.width;

上面的代碼將適合在滾動視圖寬度圖像。

5

的解決方案是相當容易......看看這個代碼(由OP方法的修改版本):

- (void)updateZoom { 
    float zoomScale = MIN(self.view.bounds.size.width/self.imageView.image.size.width, self.view.bounds.size.height/self.imageView.image.size.height); 

    if (zoomScale > 1) { 
     self.scrollView.minimumZoomScale = 1; 
    } 

    self.scrollView.minimumZoomScale = zoomScale; 
    self.scrollView.zoomScale = zoomScale; 
} 

我認爲沒有什麼解釋的代碼是直線前進。

10

上述解決方案的工作,但我努力理解爲什麼。我想分享這兩篇文章,我發現這篇文章對於正確設置mininumZoomScale以及使其與iOS8/XCode 6一起工作非常有幫助。

首先,讓滾動視圖在iOS8上工作要求您正確設置約束從頭開始。其他海報推薦,我同意,你的滾動視圖應該只有一個單一的內容視圖。很好地將所有其他視圖嵌入到一個內容視圖中,但您不希望將滾動視圖約束設置爲一堆小視圖。

將你的Top,Leading,Trailing和Bottom約束連接到內容視圖的滾動視圖(在我的情況下,它是一個UIImageView),其常量爲0.這將內容視圖的邊緣設置爲滾動視圖。

接下來,使用Equal Width和Equal Height約束將內容視圖的大小設置爲滾動視圖。您無法在內容視圖中使用「固定寬度」和「固定高度」,因爲縮放功能無效,您也無法自行管理大小。如果沒有這些約束,iOS8會將大小設置爲(0,0),然後纔有可能導致一些奇怪的工件。有了這些約束,請在orientation方法中調用updateZoom方法,這很好。在iOS7中,在didRotateFromInterfaceOrientation中調用它。在iOS8中,從viewWillTransitionToSize中調用它。您需要更新代碼以傳遞新的尺寸。

非常感謝娜塔莎的約束求解機器人:http://natashatherobot.com/ios-autolayout-scrollview/

當你打電話給你updateZoom方法來調整你的最低限度,你也應該檢查你當前zoomScale是否<您minimumZoomScale並重置它,如果它是。您不應該重置zoomScale,否則在方向更改時,這會成爲用戶的另一個令人疑惑的外觀。

至於它的其餘部分,爲什麼數學著作,喬·康威在objc.io與UIScrollViews奠定這一切了這個夢幻般的文章中就邊界與框架:http://www.objc.io/issue-3/scroll-view.html

由於雙方和海報的上方。

-(void)updateZoom { 
    self.scrollView.minimumZoomScale = MIN(self.scrollView.bounds.size.width/self.imageView.image.size.width, self.scrollView.bounds.size.height/self.imageView.image.size.height); 

    if (self.scrollView.zoomScale < self.scrollView.minimumZoomScale) 
     self.scrollView.zoomScale = self.scrollView.minimumZoomScale; 
} 
0

這裏是斯威夫特3版本

var minZoom = min(self.view.bounds.size.width/theImage!.size.width, self.view.bounds.size.height/theImage!.size.height); 

     if (minZoom > 1.0) { 
      minZoom = 1.0; 
     } 

     self.scrollImg.minimumZoomScale = minZoom; 
     self.scrollImg.zoomScale = minZoom; 
1

SWIFT 3

由於@chewy這個工作對我來說(我需要 「界限」 添加到圖像):

func setZoomScale() { 

    var minZoom = min(self.view.bounds.size.width/imageView!.bounds.size.width, self.view.bounds.size.height/imageView!.bounds.size.height); 

    if (minZoom > 1.0) { 
     minZoom = 1.0; 
    } 

    scrollView.minimumZoomScale = minZoom; 
    scrollView.zoomScale = minZoom; 

} 

然後在「override func viewWil」中調用setZoomScale() lLayoutSubviews()「