UITableViewCell如何动态适应保留宽高比的新图像?

时间:2015-05-13 09:51:10

标签: ios uitableview swift uiimageview

我正在设计一个能够将新图像动态加载到单元格中的tableview。

我的tableview层次结构如下: tableview - > myCustomCell - >内容视图 - > myCustomImageView

我想要的是:在屏幕上以给定大小显示tableViewCells(比如 300 * 50 )后,用户可以点击一些单元格来显示特定大小的图像(例如 600 * 600 )。要更新单元格,我使用 tableView.beginUpdates() tableView.endUpdates()。然后tabelViewCell的大小应更改为 300 * 300

经过这么多尝试后,我面临以下问题:

如果我将imageView的内容模式设置为aspectFit,则tableViewCell的大小和imageView的大小都变为 300 * 600 (实际图像 300 * 300 ),在单元格的顶部和底部区域有空白区域,如下所示: contentmode = aspectFit

如果我将imageView的内容模式设置为aspectFill,则tableViewCell的大小和imageView的大小都变为 300 * 600 (实际图像 600 * 600 ),左侧和右侧被剪掉,如下所示: contentmode = aspectFill

有没有让tableViewCell最适合图像同时保持纵横比?非常感谢。

2 个答案:

答案 0 :(得分:0)

加载图像时,请计算图像宽高比。

然后向UIImageView添加约束以修复其宽高比。创建后不能更改宽高比约束,因此每次更改图像时都必须删除任何现有的约束并添加新的约束。类似的东西:

// Declare constraint as a property so you can remove it
@property NSLayoutConstraint *constraint;

// Remove previous constraint as multiplier property is read only.
if (self.constraint){
  [self.imageView removeConstraint:self.constraint];
}

// Calculate aspect ration
CGFloat aspectRation = <insert calculation...>

// Add a new constraint for the new image setting the aspect ration
self.constraint = [NSLayoutConstraint constraintWithItem:self.imageView  
                                          attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual 
                                             toItem:self.imageView 
                                          attribute:NSLayoutAttributeWidth 
                                         multiplier:aspectRatio constant:0.0f];

// Add the new constraint.
[self.imageView addConstraint:constraint];

// View needs updated.
[self.contentView setNeedsLayout];

这应该强制图像计算和宽高比计算。

因此,图像视图知道其宽度或高度(但不会与宽高比冲突),您必须为图像视图添加约束以满足您的显示需求。例如您可能希望使其与包含视图具有相等的宽度,以便它始终填充整个宽度,然后高度将根据宽高比等改变...这取决于您希望图像填充单元格的方式。

如果使用故事板,您可能会发现更容易为UIImageView提供宽高比,以便IB不会抱怨缺少约束。 CTRL-将其拖动到您的单元格标题中,以便您拥有该约束的IBOutlet。第一次,从UIImageView中删除IB版本。

答案 1 :(得分:0)

希望此代码可以帮助您

cimageView.contentMode = UIViewContentModeCenter;
 if (imageView.bounds.size.width > ((UIImage*)imagesArray[i]).size.width && imageView.bounds.size.height > ((UIImage*)imagesArray[i]).size.height) {
   imageView.contentMode = UIViewContentModeScaleAspectFit;

}