如何以编程方式将 UIImageView 缩放到固定宽度和灵活高度?

Posted

技术标签:

【中文标题】如何以编程方式将 UIImageView 缩放到固定宽度和灵活高度?【英文标题】:How to programmatically scale a UIImageView to a fixed width and flexible height? 【发布时间】:2015-12-17 21:34:21 【问题描述】:

我正在尝试创建一个显示图像的单个表格视图单元格,从 Web 下载并按比例缩小以适合设备的宽度。部分问题是我需要弄清楚如何在下载图像后调整单元格的大小。换句话说,我将在加载图像时设置一个默认高度,然后在加载图像后,我想调整单元格的高度。我知道一旦我指定了固定的宽度和高度,我就可以将图像视图的内容模式设置为“宽高比适合”,但我不确定如何以编程方式设置约束以使高度保持灵活。

如何在代码中定义这些约束?

【问题讨论】:

如果我理解正确,你想让单元格的高度成为图像的高度? 不一定是图片的高度,而是和UIImageView一样的高度,因为图片已经缩小了。 图像视图的高度如何变化? 显示单元格后下载图像。假设默认高度是 50。一旦图像被下载,我们将图像设置在 UIImageView 上,内容模式为宽高比。如果我在 UIImageView 上设置了固定的宽度和高度,那么它会自动缩小图像。我知道我希望宽度是设备的全宽,但我希望高度灵活。如果是纵向图像,那么高度肯定会大于宽度。这就是我要解释的原因。但是,我不知道如何使高度灵活。 @CalebKleveter 抱歉,我意识到我的问题没有明确说明我正在下载图像。我已经更新了我的问题,以便更清楚。 【参考方案1】:

下载图片后使用此代码调整图片大小:

//example
//UIImageView *yourImageView = [self imageWithImage:yourDownloadedImage scaledToWidth:CGRectGetWidth(self.view.frame)]


- (UIImage*)imageWithImage: (UIImage*) sourceImage scaledToWidth:(float)i_width
float oldWidth = sourceImage.size.width;

if (oldWidth <= self.view.frame.size.width) 
    return sourceImage; // remove this line if you want the image width  follow your screen width

float scaleFactor = i_width / oldWidth;
float newHeight = sourceImage.size.height * scaleFactor;

UIGraphicsBeginImageContext(CGSizeMake(i_width, newHeight));
[sourceImage drawInRect:CGRectMake(0, 0, i_width, newHeight)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;

然后用这个设置你的单元格的高度:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; // i'm using static cell so i call this
    return [self calculateHeightForConfiguredSizingCell:cell];


- (CGFloat)calculateHeightForConfiguredSizingCell:(UITableViewCell *)sizingCell 
[sizingCell layoutIfNeeded];

CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height;

【讨论】:

以上是关于如何以编程方式将 UIImageView 缩放到固定宽度和灵活高度?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何以编程方式将 UILabel 和 UiImageView 添加到表视图单元格内的 UIView?

调整大小后使用自动布局以编程方式居中 UIImageVIew

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

UIImageView:旋转和缩放。如何保存结果?

iOS9:在另一个以编程方式添加的视图中居中以编程方式添加的视图