Ipad UIImageView/UIScrollView强制使用固定的纵横比以适应屏幕

Ipad UIImageView/UIScrollView强制使用固定的纵横比以适应屏幕,ipad,ios,uiscrollview,iphone,Ipad,Ios,Uiscrollview,Iphone,我正在为iPad制作一个简单的应用程序,它由一个巨大的图像组成,你可以放大/缩小并导航 此图像放置在UIImageView中,然后将其放置在UIScrollView中 导航和缩放工作100%良好;但是,图像以固定的纵横比加载以适应屏幕,并且永远不会更改(即使在放大时) 我感觉Interface Builder正在设置一些我不知道的属性,但我已经尝试了所有我能想到的方法来解决这个问题 问题: 当应用程序最初加载时,UIScrollView中的内容会自动重新调整大小,通过改变纵横比来精确匹配iPad

我正在为iPad制作一个简单的应用程序,它由一个巨大的图像组成,你可以放大/缩小并导航

此图像放置在
UIImageView
中,然后将其放置在
UIScrollView

导航和缩放工作100%良好;但是,图像以固定的纵横比加载以适应屏幕,并且永远不会更改(即使在放大时)

我感觉Interface Builder正在设置一些我不知道的属性,但我已经尝试了所有我能想到的方法来解决这个问题

问题:

当应用程序最初加载时,
UIScrollView
中的内容会自动重新调整大小,通过改变纵横比来精确匹配iPad屏幕。/fixed;实际图像是巨大的(远大于iPad的分辨率)。即使在放大图像时,此缩放纵横比仍保持不变,并使图像看起来拉伸

无论我尝试什么,我都无法阻止iPad自动重新缩放我的图像。我只是想让应用程序以我的图像在iPad上正常显示(100%缩放)开始,当前适合iPad屏幕的部分是图像的左上角

我试图解决的问题:

我尝试将Interface Builder中的
UIImageView的
内容模式更改为“左上角”。这似乎工作得很好,但后来我意识到,
UIScrollView
不允许您在图像上滚动最初显示的部分(左上角)。您可以放大左上部分并滚动,但不能超过屏幕上最初显示的内容

代码:

下面是我用来设置视图的代码
imageScrollView
UIScrollView
,而
imageView
UIImageView
。它们都是
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
来处理点击缩放,但我不认为它们是问题所在。当我把它们注释掉时,没有任何变化


非常感谢您的帮助。

由于
imageView
是scrollview的内容,请尝试将
scrollview的
内容模式更改为
UIViewContentModeScaleSpecifit
。尝试调用
imageview
上的
setNeedsDisplay

我修复了它

对于其他有相同问题的人,下面是我如何修复代码的:

该错误的原因是Interface Builder强制视图使用
ScaleToFill
contentMode
。将
ScrollView的
contentMode设置为
UIViewContentModeScaleAspectFit
本身不起作用,因为
imageView
仍被扭曲

修复方法:

必须在
uicrollview
UIImageView
的设置结束时添加以下代码(在
viewDidLoad()
方法内部):

说明:

首先,
UIScrollView的
内容模式
被设置为
AspectFit
,就像@Mike建议的那样。然后,在
imageView
上调用sizeToFit(),以覆盖Interface Builder令人讨厌的预设,并使图像大小正确

最后一行很重要。在重新调整
imageView
的大小后,必须为滚动视图设置
contentSize
。否则,
ScrollView
会认为图像仍然是iPad显示屏的大小,因此不会认为有任何东西可以滚动。在调整
图像视图的大小并更改
滚动视图的内容模式后,设置
滚动视图的大小将使
滚动视图成为图像的实际大小

希望有帮助

谢谢你的帮助,迈克,这让我走上了正轨:)

  • 亚历克斯

适用于那些在使用
UICollectionView
时需要全屏显示图像而在横向模式下努力修复图像方面的用户

-(UICollectionViewCell*)集合视图:(UICollectionView*)集合视图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;
关键是在保持正确的纵横比的同时,使图像视图框具有正确的大小。

这段代码对我很有用:(Swift)


谢谢你的回复,我感谢你的帮助。我尝试了你的建议,但不幸的是,程序的执行方式完全相同!我为scrollView设置了contentMode,并在设置结束时(在viewDidLoad()中)在imageView上调用了setNeedsDisplay。我不太使用IB,主要是因为这样的问题。您可以尝试以编程方式构建视图。这可能会消除差异/问题。我在关闭主视图停止滚动的儿童浏览器后遇到此问题。我用这个技巧在主视图上恢复了我的卷轴。很高兴(也有点难过)看到~2年后这个技巧仍然有效,并且适用于其他问题。当我遇到这个问题时,我正在使用iOS4,所以我想他们现在已经解决了…@user357086我也遇到了同样的问题。你能解释一下你是如何在ChildBrowser上应用这个的吗?
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;
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
}