2011-02-08 92 views
10

我正在爲iPad一個簡單的應用程序,包含您可以放大/縮小和瀏覽一個巨大的形象。的UIImageView/UIScrollView的強制固定縱橫比,以適應屏幕

該圖像被放置在UIImageView,然後將其放在一個UIScrollView內部內。

導航和細變焦工作100%;然而,圖像以固定長寬比裝載以適合屏幕,並且永遠不會改變(即使在放大時)。

我有一種感覺,界面生成器被設置一些屬性,我不知道,但我已經試過了我能想到的解決這個問題的一切。

問題:

當應用程序最初加載時,UIScrollView裏面的內容是自動重新調整大小由具有其長寬比changed./fixed精確地適應iPad屏幕;實際的圖像是巨大的(比iPad的分辨率更大)。即使在放大圖像時,該縮放縱橫比仍然保持不變,並導致圖像看起來拉長。

無論我怎麼努力,我不能自動重新調整我的圖片停止了iPad。我只是希望應用程序從iPad上正常顯示圖像(100%縮放)開始,目前適合iPad屏幕的部分位於圖像的左上角。

我一直試圖修復它:

我試圖改變在Interface Builder中UIImageView's內容模式爲「左上」。這似乎是完美的工作,但後來我意識到UIScrollView不會讓你滾動圖像經過最初顯示的部分(左上角)。您可以放大左上部分並滾動,但不要過去最初顯示在屏幕上的內容。

代碼:

下面是我使用的設置視圖的代碼。 imageScrollViewUIScrollView,並且imageViewUIImageView。它們都是IBOutlets

// Set the needed attributes of the imageView 
    [imageView setImage:[UIImage imageNamed: @"TestImage.png"]]; 
    imageView.userInteractionEnabled = YES; 

    // Set a bunch of the imageScrollView attributes. 

    // calculate minimum scale to perfectly fit image width, and begin at that scale 
    float minimumScale = [imageScrollView frame].size.width/[imageView frame].size.width; 
    [imageScrollView setMinimumZoomScale:minimumScale]; 
    [imageScrollView setZoomScale:1]; 
    [imageScrollView setMaximumZoomScale:10]; 
    [imageScrollView setContentSize:CGSizeMake(imageView.frame.size.width, imageView.frame.size.height)]; 
    [imageScrollView setScrollEnabled:YES]; 
    [imageScrollView setUserInteractionEnabled:YES]; 
    imageScrollView.clipsToBounds = YES; 
    imageScrollView.bounces = FALSE; 
    imageScrollView.bouncesZoom = FALSE; 

我也有兩個UIGestureRecongizers來處理自來水變焦,但我不相信他們是這個問題。當我評論他們時,沒有任何變化。

任何幫助將非常感謝

回答

16

我定了!

對於其他人有相同的問題,以下是我固定的代碼:

原因的bug是界面生成器被強迫的意見,使用ScaleToFillcontentMode。將ScrollView's contentMode設置爲UIViewContentModeScaleAspectFit並不能正常工作,因爲imageView仍然失真。

解決方法:

下面的代碼具有在設置爲UIScrollViewUIImageView(該viewDidLoad()方法的內側)的端部要被添加:

[imageScrollView setContentMode:UIViewContentModeScaleAspectFit]; 
    [imageView sizeToFit]; 
    [imageScrollView setContentSize:CGSizeMake(imageView.frame.size.width, imageView.frame.size.height)]; 

說明:

首先,UIScrollView'scontentMode設置爲AspectFit,就像@Mike建議的那樣。然後,在imageView上調用sizeToFit()以覆蓋Interface Builder令人討厭的預設,並使圖像成爲正確的大小。

最後一行很重要。您必須爲ScrollView設置contentSize之後您重新調整大小imageView。否則,ScrollView會認爲圖像仍然是iPad顯示屏的大小,因此不會認爲有任何可滾動的內容。設置ScrollView的大小後調整大小的ImageView和更改ScrollView'scontentMode使ScrollView圖像的實際大小。

希望有幫助!

感謝您的幫助邁克,它同時採用UICollectionView,同時需要圖像是讓我在正確的軌道:)

  • 亞歷
1

由於imageView是滾動視圖的內容,請嘗試將ScrollView's內容模式更改爲UIViewContentModeScaleAspectFit。嘗試在imageview上致電setNeedsDisplay

+0

感謝您的答覆,我感謝幫助。 我嘗試了你的建議,不幸的是程序執行的方式完全相同!我設置了scrollView的contentMode,並在我的設置結束時(在viewDidLoad()中)在imageView上調用了setNeedsDisplay。 – AlexFZ 2011-02-09 19:16:19

+0

我不會那麼用IB,主要是因爲這樣的問題。您可以嘗試以編程方式構建視圖。這可能會消除差異/問題。 – Rayfleck 2011-02-10 01:52:15

0

對於那些努力修復圖像方面的橫向模式上全屏。

在你- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath做到以下幾點:

CGFloat newWidth = self.view.bounds.size.width; //if iPad in landscape and fullscreen value is 1024 
CGFloat newHeight = image.size.height/image.size.width * newWidth; 

cell.clipsToBounds = YES; 
cell.imageView.frame = CGRectMake(0, 0, newWidth, newHeight); 
cell.imageView.contentMode = UIViewContentModeScaleAspectFill; 
cell.imageView.image = image; 
cell.scrollView.contentSize = cell.imageView.frame.size; 

最關鍵的事情是使圖像視圖幀正確的大小,同時保持正確的縱橫比。

0

此代碼爲我工作:(SWIFT)

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    let imgView = UIImageView(image: UIImage(named: "MyImage")) 
    imgView.contentMode = .ScaleAspectFit 
    var size = imgView.frame.size 
    size.height = size.height/size.width * scrollView.frame.width 
    size.width = scrollView.frame.width 
    imgView.frame.size = size 
    scrollView.addSubview(imgView) 
    scrollView.contentSize = size 
} 
相關問題