2011-02-08 79 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 
}