如何以编程方式在uiview上拟合图像

时间:2017-04-15 21:29:45

标签: ios objective-c uiimageview uiimage

我以编程方式在视图控制器上添加了uiview作为子视图(称为contentView)。我还以编程方式在该uiview上添加了一个图像。每次我在iPad上运行应用程序时,图像都会被拉伸!如何修复图像以使其适合iPad屏幕但不拉伸图像?我知道drawInRect正在拉伸图像。那么我该如何解决这个问题呢?

这是我的代码:

UIGraphicsBeginImageContextWithOptions(self.contentView.bounds.size, self.contentView.opaque, 0.0);

[[UIImage imageNamed:@"menu image 2.JPG"] drawInRect:self.contentView.bounds];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();  

UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

[self.contentView addSubview:imageView];

4 个答案:

答案 0 :(得分:2)

更改以下代码

UIImage *image = [UIImage imageNamed:@"menu image 2.JPG"];

UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

imageView.contentMode = UIViewContentModeScaleAspectFit;

[self.contentView addSubview:imageView];

答案 1 :(得分:2)

UIImageView有一个名为contentMode的属性,用于确定在视图上下文中如何处理图像布局。 contentMode的类型为UIViewContentMode

默认值为UIViewContentModeScaleToFill,可在不考虑宽高比的情况下拉伸图像。我假设正在改变长宽比导致问题。

如果您希望缩放图像,但保持纵横比,则有两种选择:

  1. UIViewContentModeScaleAspectFit:这将显示缩放图像以填充视图,但不会剪切任何内容(如果宽高比与视图大小不匹配,则会显示水平或垂直条带)

  2. UIViewContentModeScaleAspectFill:这会缩放图片以完全填充视图,而不会显示任何波段 - 如果图像比率与视图比率不匹配,则会导致内容被裁剪。

  3. 要在Objective-C中的图像视图上设置contentMode,请使用以下语法:

    UIImage *image = [UIImage imageNamed:@"menu image 2.JPG"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    imageView.contentMode = UIViewContentModeScaleAspectFill;
    ...
    

    您不应该使用自定义上下文绘图来继续工作(感谢Losiowaty向我询问此事)。

答案 2 :(得分:0)

我猜您的self.contentView.bounds菜单图片2.JPG 的宽高比不同。对于实验,请尝试查看菜单图像2.JPG 的分辨率。例如,如果它是300x150,则它的宽高比是(300/150 = 2:1)。将self.contentView.bounds设置为此纵横比并绘制图像并检查结果。它不会伸展。

答案 3 :(得分:-1)

请在项目中添加此单行代码

yourImage .contentMode = UIViewContentModeScaleAspectFit;