【问题标题】:How to fit an image on a uiview programmatically如何以编程方式将图像适合uiview
【发布时间】:2017-04-15 21:29:45
【问题描述】:

我以编程方式在视图控制器上添加了一个 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];

【问题讨论】:

  • 这样复杂的图像分配有什么原因吗? [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"menu image 2.JPG"]]; - 这应该是所有需要的。为此创建新的图像上下文似乎有点过头了。

标签: ios objective-c uiimageview uiimage


【解决方案1】:

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

默认值为UIViewContentModeScaleToFill,它会在不考虑纵横比的情况下拉伸图像。我假设这是导致问题的变化的纵横比。

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

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

  2. UIViewContentModeScaleAspectFill:这将缩放图像以完全填充视图,没有任何条纹 - 如果图像比例与视图比例不匹配,这将导致内容被剪裁。

    李>

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

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

您应该不再需要使用自定义上下文绘图来让它工作(感谢 Losiowaty 询问我这个问题)。

【讨论】:

  • 如果 OP 已经创建了图像的拉伸版本,通过在自定义上下文中绘制它,这是否可行?
  • 好点,忘了提。我想 OP 可以替换自定义上下文绘图。我将更新我的帖子以反映如何实例化图像。 +1
  • 我明白了。但是,两者都行不通。 Aspect fit 显示垂直带,Aspect Fill 像你说的那样剪辑内容。我认为最好的解决方案是 NSLayout 约束——以编程方式完成的尾随、前导、顶部和底部布局约束。知道如何以编程方式执行此操作吗?我是 Objective-C 的新手。感谢您的帮助。
  • 嗯,如果 FitFill 不能完成这项工作,我不明白你想要完成什么。您是否尝试放大图像以填充尽可能多的空间?还是只显示图像而不进行缩放?
  • 如果您可以使用示例屏幕截图或草图更新问题,这可能有助于我们理解问题。
【解决方案2】:

修改代码如下

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

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

imageView.contentMode = UIViewContentModeScaleAspectFit;

[self.contentView addSubview:imageView];

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      yourImage .contentMode = UIViewContentModeScaleAspectFit;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-21
        • 2017-01-28
        相关资源
        最近更新 更多