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