调整图像大小以适应UIImageView

25

我对Objective-C非常陌生,正在开始学习。我想做一些非常简单的事情,但却很具有挑战性:

我试图将一张图片显示到 UIImageView 中。我要显示的图片太大了,我希望它能缩小以适应 UIImageView。我尝试设置AspectFit视图模式,但是图片被显示为原始大小,并且被 UIImageView 裁剪。我的代码如下:

- (void)changeImages
{
    UIImage* img11 = nil;

    img11 = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"dog" ofType:@"jpeg"]];

    u11.contentMode = UIViewContentModeScaleAspectFit;
    u11.image = img11;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self changeImages];
}

有谁能够解释一下这个问题吗?

谢谢!


1
你有没有看过https://dev59.com/E3VC5IYBdhLWcg3wykUt? 特别是第二个答案可能会很有用。 - FD_
按照道理,这应该可以工作。需要检查的事项:您是否已在nib/storyboard中设置图像?如果是,则可能掩盖了未调用的代码。changeImages是否被调用了?您可以调用NSLog(@"changeImages called")来查看它是否被调用,或者使用断点。如果没有被调用,您可能忘记将nib/storyboard中的ViewController类更改为上面编写的代码类。u11是否指定为IBOutlet并正确链接到nib/storyboard? - Xono
如果你对Objective-C非常陌生,最好使用第三方库来调整图像大小,例如https://github.com/mattgemmell/MGImageUtilities。 - martinezdelariva
u11 周围的视图层次结构是什么?也许不是 UIImageView 裁剪了图像,而是父视图? - Bryan
“u11”的框架尺寸是多少?它的“autresizesSubviews”属性设置为“YES”了吗? - Carl Veazey
6个回答

32

嗨,我建议尝试这个...

- (void)changeImages
{
    UIImage *img11 = [UIImage imageNamed@"dog.jpeg"];

    u11.contentMode = UIViewContentModeScaleAspectFit;
    u11.clipsToBounds = YES;
    [u11 setImage:img11];
}

- (void)viewWillAppear:animated
{
    [super viewWillAppear:animated];

    [self changeImages];
}

这将缩放图像(向上或向下),以便它适合于imageView内部。拥有clipsToBounds并不是必需的,但会防止图像显示在imageView框架之外。

希望对你有所帮助。


在Swift 5中,UIViewContentModeScaleAspectFit现在是"UIView.ContentMode.scaleAspectFit",YES现在是"true"。请注意,根据情况,您可能希望使用scaleAspectFill而不是scaleAspectFit。 - Andy Weinstein

17

将以下代码添加到您的UIViewController.m文件中:

-(UIImage *)resizeImage:(UIImage *)image imageSize:(CGSize)size
{
    UIGraphicsBeginImageContext(size);
    [image drawInRect:CGRectMake(0,0,size.width,size.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    // here is the scaled image which has been changed to the size specified
    UIGraphicsEndImageContext();
    return newImage;
}

使用:

UIImage *image = [UIImage imageNamed:@"image.png"];
CGSize size = CGSizeMake(50, 63); // set the width and height 
UIImage *resizedImage = [self resizeImage:image imageSize:size];

我希望它能对你有所帮助。


那么,如果我有一个UITableView,它从在线获取数据以填充UITableViewCells图片,并且我想通过这种方式调整我的图像大小以提高性能,我应该在cellForRowAtIndexPath中调用这个方法吗? - Brandon A

4
CGSize size=CGSizeMake(79, 84);//set the width and height
UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0,0,size.width,size.height)];
UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
//here is the scaled image which has been changed to the size specified
UIGraphicsEndImageContext();

这肯定有效,请不要忘记导入QuartzCore框架。
祝你编码愉快 (^_^)....

+1 Quartz方法。它比标准的UIKit contentMode属性更好地完成了调整大小的工作。 - danielbeard

1

您还可以在界面构建器中的属性检查器中将 View:Mode 设置为 Aspect Fit


0
我做了以下操作并得到了帮助:将模式改为“Aspect Fill”(从默认值“Scale to fill”),并在代码中添加一行(我是在单元格配置中完成的)。
cell.photo.clipsToBounds = true

0

我知道这个问题很旧,但我想基于斯坦福大学193p 2017年第11讲(约18:45)添加一个回应,并且对于任何在寻找Swift方面的人来说,这是我看到的第一个搜索结果。

基本上,子类化UIView并使其看起来像:

class U11: UIView {
    var myImage: UIImage? { didSet { setNeedsDisplay() }}
    override func draw(_ rect: CGRect) {
        myImage?.draw(in: bounds)
    }
}

然后使用以下代码设置图像:

func changeImage() {
    if let img11 = UIImage(named: "dog.jpeg"){
            u11.myImage = img11
    }
}

这很简单,图像占据了视图边界内的整个空间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接