我遇到了同样的问题,下面是我为使它对我有用所做的工作。
我有几个应用程序中使用的图像,需要为新的 4 英寸显示屏调整大小。我编写了下面的代码来根据需要自动调整图像大小,而无需指定视图的高度。此代码假定给定图像的高度在 NIB 中调整为给定帧的全高,就像它是填充整个视图的背景图像一样。在 NIB 中,UIImageView 不应设置为拉伸,这将为您完成拉伸图像的工作并扭曲图像,因为只有高度发生变化而宽度保持不变。您需要做的是将高度和宽度调整相同的增量,然后将图像向左移动相同的增量以再次居中。这会在两侧切掉一点,同时使其扩展到给定框架的整个高度。
我这样称呼它...
[self resizeImageView:self.backgroundImageView intoFrame:self.view.frame];
如果图像是在 NIB 中设置的,我通常会在 viewDidLoad 中执行此操作。但我也有在运行时下载并以这种方式显示的图像。这些图像是用 EGOCache 缓存的,所以我必须在将缓存的图像设置到 UIImageView 之后或在图像下载并设置到 UIImageView 之后调用 resize 方法。
下面的代码并不特别关心显示器的高度是多少。它实际上可以与任何显示尺寸一起使用,也许也可以处理调整图像大小以进行旋转,认为它假设每次高度变化都大于原始高度。为了支持更大的宽度,还需要调整此代码以响应该场景。
- (void)resizeImageView:(UIImageView *)imageView intoFrame:(CGRect)frame {
// resizing is not needed if the height is already the same
if (frame.size.height == imageView.frame.size.height) {
return;
}
CGFloat delta = frame.size.height / imageView.frame.size.height;
CGFloat newWidth = imageView.frame.size.width * delta;
CGFloat newHeight = imageView.frame.size.height * delta;
CGSize newSize = CGSizeMake(newWidth, newHeight);
CGFloat newX = (imageView.frame.size.width - newWidth) / 2; // recenter image with broader width
CGRect imageViewFrame = imageView.frame;
imageViewFrame.size.width = newWidth;
imageViewFrame.size.height = newHeight;
imageViewFrame.origin.x = newX;
imageView.frame = imageViewFrame;
// now resize the image
assert(imageView.image != nil);
imageView.image = [self imageWithImage:imageView.image scaledToSize:newSize];
}
- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}