我正在为iPad制作一个简单的应用程序,它包含一个可以放大/缩小并导航的巨型图像。
此图片位于UIImageView
内,然后放在UIScrollView
内。
导航和缩放工作100%罚款;但是,图像以固定的宽高比加载以适合屏幕,并且永远不会改变(即使在放大时)。
我觉得Interface Builder正在设置一些我不知道的属性,但我已经尝试了一些我能想到的解决这个问题的方法。
问题:
当应用程序最初加载时,UIScrollView
内的内容会自动调整大小,以便通过更改其宽高比来完全适合iPad屏幕./fixed;实际图像很大(比iPad分辨率大)。即使放大图像,这种缩放的宽高比仍然保持不变,并使图像看起来很拉伸。
无论我尝试什么,我都无法阻止iPad自动重新缩放我的图片。我只是希望应用程序以我在iPad上正常显示的图像(100%缩放)开始,当前适合iPad屏幕的部分是图像的左上角。
我试图修复它:
我尝试将Interface Builder中的UIImageView's
内容模式更改为“左上角”。这似乎工作得很好,但后来我意识到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
来处理点按 - 缩放,但我不相信它们是问题所在。当我评论它们时,没有任何改变。
任何帮助都非常赞赏。
答案 0 :(得分:16)
我修好了!
对于其他遇到同样问题的人,以下是我修复代码的方法:
错误的原因是Interface Builder强制视图使用ScaleToFill
contentMode
。将ScrollView's
contentMode设置为UIViewContentModeScaleAspectFit
并不能自行运行,因为imageView
仍然被扭曲。
修复:
必须在UIScrollView
和UIImageView
(viewDidLoad()
方法内部)的设置结束时添加以下代码:
[imageScrollView setContentMode:UIViewContentModeScaleAspectFit];
[imageView sizeToFit];
[imageScrollView setContentSize:CGSizeMake(imageView.frame.size.width, imageView.frame.size.height)];
<强>解释强>
首先,UIScrollView's
contentMode
设置为AspectFit
,就像@Mike建议的那样。然后,在imageView
上调用sizeToFit()以覆盖Interface Builder令人讨厌的预设,并使图像的大小正确。
最后一行非常重要。在您重新调整contentSize
的大小后,必须为ScrollView设置imageView
。否则,ScrollView
会认为图像仍然是iPad显示屏的大小,因此不会认为有任何可滚动的内容。设置ScrollView
的大小调整ImageView
的大小并更改ScrollView's
contentMode
会使ScrollView
的实际大小变为{{1}}图像。
希望有所帮助!
感谢Mike的帮助,它让我走上正轨:)
答案 1 :(得分:1)
由于imageView
是滚动视图的内容,因此请尝试将ScrollView's
内容模式更改为UIViewContentModeScaleAspectFit
。尝试拨打setNeedsDisplay
上的imageview
。
答案 2 :(得分:0)
对于那些在使用UICollectionView
同时需要将图像设置为全屏时在横向模式下修复图像方面的人。
在- (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;
关键是要保持图像视图的正确尺寸,同时保持正确的宽高比。
答案 3 :(得分:0)
这段代码对我有用:(斯威夫特)
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
}