UIImageView 不会以编程方式更改尺寸

Posted

技术标签:

【中文标题】UIImageView 不会以编程方式更改尺寸【英文标题】:UIImageView doesn't change dimensions programmatically 【发布时间】:2014-08-10 22:49:34 【问题描述】:

我应该如何以编程方式调整 Storyboard 文件中创建的 UIImageView 的尺寸以匹配特定图像的尺寸?将 UIImageView 的 frame 或 bounds 设置为所选图像的 frame 或 bounds 不会改变 Xcode ios 模拟器中 imageView 的大小。我查看了许多其他类似的问题并尝试了他们的答案,但到目前为止,他们给出的修复似乎都没有奏效。

这是用于尝试调整 UIImageView 大小的代码:

-(void)viewWillAppear:(BOOL)animated
    //Get selected image
    UIImage *selectedImage=[UIImage imageNamed:selectedItem.pictureName];

    //Set imageView's image to selected image
    imageView.image=selectedImage;

    //Make new frame with dimensions of selected image and same origin
    CGRect newImageViewFrame=CGRectMake(imageView.frame.origin.x,imageView.frame.origin.y,selectedImage.size.width,selectedImage.size.height);

    //Set imageView's frame to match that of the newly created frame
    imageView.frame=newImageViewFrame;

    [super viewWillAppear:animated];

正确调整 imageView 大小的唯一方法是将静态 imageView 替换为以编程方式创建的 imageView 以匹配 selectedImage 的框架。从头开始创建新的 UIImageView 时,这似乎很奇怪,但在尝试调整现有 UIImageView 的大小时却不行。

我的项目目前正在使用 AutoLayout,但我没有为相关的 UIImageView 添加任何约束。这可能是问题的根源吗?

【问题讨论】:

图片视图的内容模式是什么?您是否尝试过设置父视图的 view.clipsToBounds = YES? 您确定XIB中的ImageView已经正确连接到IBOutlet了吗? 我试过selectedImage.clipsToBounds=YES;selectedImage.contentMode=UIViewContentModeScaleAspectFit;,但似乎都没有任何效果。我假设 imageView 连接正确,因为 Storyboard 显示了 selectedImageReferencing Outlets 下的 ViewController 之间的连接,并且 ViewController.hselectedImage 旁边的圆圈是阴影。 【参考方案1】:

我的项目目前正在使用 AutoLayout,但我没有为相关的 UIImageView 添加任何约束。这可能是问题的根源吗?

是的。当您不指定约束时,您会自动获得“固定框架”约束。图像视图的约束看起来像这样:

<NSIBPrototypingLayoutConstraint:0x7f95a943bad0 'IB auto generated at build time for view with fixed frame' H:|-(87)-[UIImageView:0x7f95a9b112b0](LTR)   (Names: '|':UIView:0x7f95a974e7c0 )>,
<NSIBPrototypingLayoutConstraint:0x7f95a943bfe0 'IB auto generated at build time for view with fixed frame' V:|-(217.5)-[UIImageView:0x7f95a9b112b0]   (Names: '|':UIView:0x7f95a974e7c0 )>,
<NSIBPrototypingLayoutConstraint:0x7f95a943c030 'IB auto generated at build time for view with fixed frame' H:[UIImageView:0x7f95a9b112b0(146)]>,
<NSIBPrototypingLayoutConstraint:0x7f95a943c080 'IB auto generated at build time for view with fixed frame' V:[UIImageView:0x7f95a9b112b0(132)]>,

因此,当重新应用固定框架约束时,您尝试修改框架会被覆盖。

您需要做的是建立水平和垂直位置约束。一旦你这样做了,你将不再得到固定的框架约束。由于您没有限制大小,它将由intrinsicContentSize 属性确定,这将是图像的大小。

还有一个细节是,如果您没有在情节提要中设置图像,则需要在 Size Inspector 中指定占位符内在内容大小,否则您将在 IB 中收到缺少约束的错误。

【讨论】:

以上是关于UIImageView 不会以编程方式更改尺寸的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式更改 UIImageView 的高度?

如何以编程方式更改使用自动布局在情节提要上创建的 UIImageView 的大小?

如何以编程方式自动旋转UIScrollView和UIImageView?

以编程方式更改 UIImageView Xcode Swift 的高度和宽度

以编程方式(使用 SnapKit)构建 UI 时如何正确使用尺寸类?

以编程方式声明的 UICollectionView 不会更改 Swift 5 中单元格的大小