【问题标题】:Auto Layout keeps stretching UIImageView自动布局不断拉伸 UIImageView
【发布时间】:2014-01-17 14:37:41
【问题描述】:

我正在使用自动布局,它让我发疯。我已经尽我所能来防止 UIImageView 到处伸展。我不知道为什么会这样。我尝试使用约束,解决自动布局问题。目前,唯一的解决方案是转动自动布局本身。

谁能告诉我为什么 xcode 完全无视我的约束?当我明确地将它设置为 UIImage 时,我希望它保持为 320x320,但是 noooooooo....

我想发布图片,但网站不让我发布,我想在这个问题中添加代码,以便更具体,但实际上根本没有代码。我只是从情节提要中拖出“UIImageView”,使其变小,按原样设置约束,它只是忽略了我的代码。

【问题讨论】:

  • 定义“全身伸展”以及您“尝试过”的具体内容。你设置了什么限制?
  • 你添加了什么约束?听起来您对超级视图的两侧(或顶部和底部,取决于它的拉伸方式)都有限制。
  • 这个问题不难重现。 1:将UIImageView放在storyboard的UIView中。 2:让它变小,至少不要像屏幕那么大 3:编译,并敬畏它是如何不工作的。 appcoda.com/ios-programming-camera-iphone-app 这个网站甚至只是建议关闭自动布局。如果我只是制作一个单视图应用程序,我会这样做,但我不是,所以....我为 UIImageView 本身的大小添加了约束。而 xcode 完全、完全地忽略了这个约束。结果在我的屏幕上只是一个可怕的全拉伸图像。
  • 你的内容模式是什么?可能发生的情况是您的内容模式设置为拉伸图像,而您没有将 clipsToBounds 设置为 YES。
  • 哦哇......那个......那个......那个选项让我诅咒史蒂夫乔布斯3小时......哇......谢谢,我现在可以终于去睡觉了。谢谢你,你是个天才。

标签: ios iphone objective-c xcode storyboard


【解决方案1】:

我的问题在于ContentHuggingPriorityContentCompressionResistancePriority

第一个控制视图“拥抱”图像的重要性(保持靠近它而不是扩展),后者控制视图对压缩的抵抗力。

我们使用PureLayout,所以修复它的代码是:

[NSLayoutConstraint autoSetPriority:ALLayoutPriorityRequired forConstraints:^{
    [myImageView autoSetContentCompressionResistancePriorityForAxis:ALAxisHorizontal];
    [myImageView autoSetContentHuggingPriorityForAxis:ALAxisHorizontal];
}];

(我的问题只在横轴)

2016 年 5 月 15 日:更新为 PureLayout v3 语法。如果您使用版本 UIView 而不是 NSLayoutConstraint。谢谢Rudolf J

【讨论】:

  • 这是一个很好的解决方案。 PureLayout 现在已将其更改为 [NSLayoutConstraint autoSetPriority.... 然而...
【解决方案2】:

我遇到了同样的问题。我在原型单元格中添加了一个 UIImageView 并希望将其与文本对齐,但是当我应用约束时它一直在拉伸图像。就我而言,我将 Image View 的“Mode”属性更改为“Aspect Fit”,效果很好。

【讨论】:

  • 遇到了完全相同的问题。使用 Aspect Fit 内容模式解决了它。仍然不知道为什么它的行为不正确。
【解决方案3】:

您可以尝试以编程方式添加 UIImageView。 在您的 viewDidLoad 方法中或您想要的地方调用此代码。

UIImageView *yourImageView = [[UIImageView alloc]initWithFrame:CGRectMake(50.0f, 50.0f, 320.0f, 320.0f)]; // x and y coordinates, width and height of UIImageView
[yourImageView setImage:[UIImage imageNamed:@"your_image.png"]];
[yourImageView setContentMode:UIViewContentModeCenter]; // you can try use another UIViewContentMode

[self.view addSubview:yourImageView];

【讨论】:

  • 感谢您的回答,我试过了,但它仍然变得非常大。 UIImageView 是一个实际的视图,比如一个窗口,还是只是一个可以被任何东西覆盖的临时东西?也就是说,如果我将 320x320 的图像放在 240x240 的 imageview 中,它会变大吗?
  • 你可以尝试使用:[yourImageView setContentMode:UIViewContentModeCenter]; More info about UIViewContentMode
【解决方案4】:

您需要确保您的UIImageView 设置为剪辑到边界。否则,图像将溢出视图,并且似乎无法正确拉伸(即使实际上是这样)。

在界面生成器中,确保选中剪辑子视图框。

如果你没有使用界面生成器,下面的代码会做同样的事情:

yourImageView.clipsToBounds = YES;

【讨论】:

  • 虽然这可行,但我仍然认为某处存在错误 - 至少在文档中,如果不是在 UIImageView 本身。 clipsToBounds 不是记录为剪辑“子视图”吗?从什么时候开始将 UIImageView 中的图像视为子视图?
  • 在文档中,他们确实将其称为“基于视图的容器”——容器是让他们站稳脚跟的词。无论如何,UIKit 文档如果不是片状和不一致的,那就什么都不是。
  • 伙计,你救了我的命!谢谢!
  • Fooh... 我正要写一封信给霍格沃茨校长,因为 UIImageView 行为的这种魔法,但你救了我的命。解决方案简单而出色。谢谢!
  • 老实说,我从未如此高兴地阅读过关于 SO 的答案。先生,您是一位公认的英雄。我差点把我的电脑扔出窗外。
【解决方案5】:

使用自动布局,尺寸检查器中的值几乎会被忽略。

您可能希望,如果在 Size Inspector 的框中输入数字,Xcode 会自动创建约束以反映您输入的内容,但事实并非如此。您需要自己为UIImageView 的高度和宽度创建“Pin”约束。

  • 选择故事板上的图像视图

  • 点击故事板屏幕右下角的“Pin”按钮

  • 在“宽度”和“高度”字段中输入所需的尺寸,并确保选中这些框

  • 单击“添加 2 个约束”按钮

完成后,您应该能够在屏幕右侧的尺寸检查器中看到您的约束(紫色框)

【讨论】:

  • 感谢您的回答,我已经完成了所有这些。事实证明,图像视图没有被拉伸,导入视图的图像被裁剪到视图之外。常识表明,默认情况下,里面的内容通常会保留在视图中,但我想不会。通过检查“剪辑子视图”解决了这个问题。业余的错误,这是肯定的。
  • @GyuhyeonLee:如果您刚开始使用 iOS 编程,请不要假设默认情况下会发生任何事情 - 根据我的经验,它几乎不会像我假设的那样运行。很高兴您找到了解决方案!
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多