如何按比例缩放UIImageView ?

我有一个UIImageView目标是按比例缩小它通过给它一个高度或宽度。

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];


//Add image view
[self.view addSubview:imageView];


//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;


//change width of frame
CGRect frame = imageView.frame;
frame.size.width = 100;
imageView.frame = frame;

图像确实调整了大小,但位置不在左上方。缩放image/imageView的最佳方法是什么?我如何纠正位置?

344164 次浏览

我觉得你可以

image.center = [[imageView window] center];

你可以试着让imageView的大小与image匹配。下面的代码没有经过测试。

CGSize kMaxImageViewSize = {.width = 100, .height = 100};
CGSize imageSize = image.size;
CGFloat aspectRatio = imageSize.width / imageSize.height;
CGRect frame = imageView.frame;
if (kMaxImageViewSize.width / aspectRatio <= kMaxImageViewSize.height)
{
frame.size.width = kMaxImageViewSize.width;
frame.size.height = frame.size.width / aspectRatio;
}
else
{
frame.size.height = kMaxImageViewSize.height;
frame.size.width = frame.size.height * aspectRatio;
}
imageView.frame = frame;

下面是如何轻松扩展它的方法。

这适用于2。x的模拟器和iPhone。

UIImage *thumbnail = [originalImage _imageScaledToSize:CGSizeMake(40.0, 40.0) interpolationQuality:1];

我刚刚尝试了这个,UIImage不支持_imageScaledToSize。

最后我用一个类别给UIImage添加了一个方法——这是我在Apple Dev论坛上找到的建议。

在项目范围内。h -

@interface UIImage (Extras)
- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize;
@end;

实现:

@implementation UIImage (Extras)


- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize {


UIImage *sourceImage = self;
UIImage *newImage = nil;


CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;


CGFloat targetWidth = targetSize.width;
CGFloat targetHeight = targetSize.height;


CGFloat scaleFactor = 0.0;
CGFloat scaledWidth = targetWidth;
CGFloat scaledHeight = targetHeight;


CGPoint thumbnailPoint = CGPointMake(0.0,0.0);


if (CGSizeEqualToSize(imageSize, targetSize) == NO) {


CGFloat widthFactor = targetWidth / width;
CGFloat heightFactor = targetHeight / height;


if (widthFactor < heightFactor)
scaleFactor = widthFactor;
else
scaleFactor = heightFactor;


scaledWidth  = width * scaleFactor;
scaledHeight = height * scaleFactor;


// center the image


if (widthFactor < heightFactor) {
thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
} else if (widthFactor > heightFactor) {
thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
}
}




// this is actually the interesting part:


UIGraphicsBeginImageContext(targetSize);


CGRect thumbnailRect = CGRectZero;
thumbnailRect.origin = thumbnailPoint;
thumbnailRect.size.width  = scaledWidth;
thumbnailRect.size.height = scaledHeight;


[sourceImage drawInRect:thumbnailRect];


newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();


if(newImage == nil) NSLog(@"could not scale image");




return newImage ;
}


@end;

修复容易,一旦我找到文档!

 imageView.contentMode = .scaleAspectFit

我们可以这样调整UIImage的大小

image = [UIImage imageWithCGImage:[image CGImage] scale:2.0 orientation:UIImageOrientationUp];
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];




//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;


//change width of frame
//CGRect frame = imageView.frame;
//frame.size.width = 100;
//imageView.frame = frame;


//original lines that deal with frame commented out, yo.
imageView.frame = CGRectMake(10, 20, 60, 60);


...


//Add image view
[myView addSubview:imageView];

上面的原始代码在iOS 4.2中运行得很好。

我发现创建一个CGRect并指定所有的顶部,左侧,宽度和高度值是在我的情况下调整位置的最简单的方法,这是在表格单元格中使用UIImageView。(仍然需要添加代码来释放对象)

imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.clipsToBounds = YES;

我已经看到了一些关于比例类型的对话,所以我决定把一个文章介绍了一些最流行的内容模式扩展类型放在一起。

相关图片如下:

enter image description here

UIImageView + Scale.h:

#import <Foundation/Foundation.h>


@interface UIImageView (Scale)


-(void) scaleAspectFit:(CGFloat) scaleFactor;


@end

UIImageView + Scale.m:

#import "UIImageView+Scale.h"


@implementation UIImageView (Scale)




-(void) scaleAspectFit:(CGFloat) scaleFactor{


self.contentScaleFactor = scaleFactor;
self.transform = CGAffineTransformMakeScale(scaleFactor, scaleFactor);


CGRect newRect = self.frame;
newRect.origin.x = 0;
newRect.origin.y = 0;
self.frame = newRect;
}


@end

通过选择模式Aspect Fill来设置你的ImageView,并选中Clip Subviews框。

enter image description here

斯威夫特:

self.imageViews.contentMode = UIViewContentMode.ScaleToFill

我使用以下代码。imageCoverView是UIView持有UIImageView

if (image.size.height<self.imageCoverView.bounds.size.height && image.size.width<self.imageCoverView.bounds.size.width)
{
[self.profileImageView sizeToFit];
self.profileImageView.contentMode =UIViewContentModeCenter
}
else
{
self.profileImageView.contentMode =UIViewContentModeScaleAspectFit;
}

通常我使用这个方法为我的应用程序(快2.倍兼容):

// Resize UIImage
func resizeImage(image:UIImage, scaleX:CGFloat,scaleY:CGFloat) ->UIImage {
let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(scaleX, scaleY))
let hasAlpha = true
let scale: CGFloat = 0.0 // Automatically use scale factor of main screen


UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
image.drawInRect(CGRect(origin: CGPointZero, size: size))


let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage
}

这对我来说很好Swift 2.x:

imageView.contentMode = .ScaleAspectFill
imageView.clipsToBounds = true;

设置你的UIimageview的规模.........

enter image description here

如果这里提出的解决方案对您不起作用,并且您的图像资产实际上是PDF,请注意XCode实际上将PDF与图像文件区别对待。特别是,它似乎不能适当地缩放以填充PDF:它最终是平铺的。这让我抓狂,直到我发现问题出在PDF格式上。将其转换为JPG格式,然后就可以开始了。