UITableViewCell中得UIImageView的大小固定

UITableViewCell中得UIImageView的大小固定,第1张

通常需要imageView,textLabel,detailTextlabel,而UITableViewCell本身提供了方便的自动布局(当有图片和没图片时,textLabel和detailLabel的位置会左右自动调整). 但是图片的大小却是没有办法固定的(直接设置imageView.frame是无法固定imageView的大小的),那么一般来说解决这个问题的办法有两种:

固定显示图片的大小(包括PlaceHolder)

自定义tableViewCell,添加自定义的imageView,textLabel和detailTextLabel

这两种方式都可以解决这个问题,但是这两种方式其实都挺麻烦的,能否直接固定imageView的大小呢? 方法是有的,只需要重载layoutSubviews即可

#import"MyCell.h"

@implementation MyCell

-(void)layoutSubviews{

UIImage*img =self.imageView.image

self.imageView.image= [UIImageimageNamed:@"017.png"]

[superlayoutSubviews]

self.imageView.image= img

}

@end

我们只要使用MyCell就可以固定imageView的大小了,且大小为017.png的大小(一般来说这种页面都会使用一个017.png来显示默认图片).

原理是在UItableVeiw的layoutSubviews调用时,会根据imageView.image的大小来调整imageView,textLabel,detailTextLabel的位置,在此之前我们先将imageView.image设置为017.png图片,等待重新布局完后再将原本的图片设置回去就可以了

我们假设要在截图中的举行图片展示区显示图片,由于原图片的宽高比例与图片显示窗口的宽高比例不一定相同,所以,直接将图片扔进去会改变图片的宽高比例,展示效果不好。

这时你可能想到设置UIImageView的属性 _imageView.contentMode = UIViewContentModeCenter  设置该属性后,我们会发现图片的宽高比例确实正确了,但是窗口中只显示了图片的一部分,这说明图片整体尺寸没有压缩,按照原图进行显示了。怎样才能达到既缩小图片又不改变原来的宽高比例呢?

方法一:将图片按照原来的宽高比例压缩到与窗口合适的大小,然后在设置了_imageView.contentMode = UIViewContentModeCenter  这个属性的UIImageView中展示压缩后的图片。

//压缩图片

- (UIImage *)image:(UIImage*)image scaledToSize:(CGSize)newSize

{

// 创建一个图形上下文形象

UIGraphicsBeginImageContext(newSize)

// 告诉旧图片画在这个新的环境,所需的

// 新的尺寸

[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]

// 新形象从上下文

UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext()

// 结束上下文

UIGraphicsEndImageContext()

// 返回新形象

return newImage

}

上面方法的参数newSize是和图片显示窗口差不多大的,结果出现了原图清晰,但压缩后图片不清晰的情况。

方法二:按照窗口宽高比例,将原图横向或者纵向裁剪掉多余的部分,然后不设置UIImageView的contentMode属性,将裁剪后的图片送进去,使其自动适应窗口。

//裁剪图片

- (UIImage *)cutImage:(UIImage*)image

{

//压缩图片

CGSize newSize

CGImageRef imageRef = nil

if ((image.size.width / image.size.height) <(_headerView.bgImgView.size.width / _headerView.bgImgView.size.height)) {

newSize.width = image.size.width

newSize.height = image.size.width * _headerView.bgImgView.size.height / _headerView.bgImgView.size.width

imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(0, fabs(image.size.height - newSize.height) / 2, newSize.width, newSize.height))

} else {

newSize.height = image.size.height

newSize.width = image.size.height * _headerView.bgImgView.size.width / _headerView.bgImgView.size.height

imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(fabs(image.size.width - newSize.width) / 2, 0, newSize.width, newSize.height))

}

return [UIImage imageWithCGImage:imageRef]

}

结果表明方法二效果更好。

在使用 UIImageView 获取加载网络图片时。

UIImageView 有几种用来设置图片显示方式的模式 contentMode 。

如居中、居右,是否缩放等,有以下几个常量可以设置:

保证图片不因为 UIImageView 的大小而拉伸、压缩变形:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11557961.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存