Swift iOS 图片自适应,UIImageView自适应图片
Swift iOS 图片自适应,ImageView适应图片
iOS 提供了很多图片适应ImageView的方法,比如Switf提供的(其实就是少了些单词而已):
1 public enum UIViewContentMode : Int { 2 3 case ScaleToFill 4 case ScaleAspectFit // contents scaled to fit with fixed aspect. remainder is transparent 5 case ScaleAspectFill // contents scaled to fill with fixed aspect. some portion of content may be clipped. 6 case Redraw // redraw on bounds change (calls -setNeedsDisplay) 7 case Center // contents remain same size. positioned adjusted. 8 case Top 9 case Bottom 10 case Left 11 case Right 12 case TopLeft 13 case TopRight 14 case BottomLeft 15 case BottomRight 16 }
我们在日常使用的时候,为了不让图片失真,我们经常使用时的.ScaleAspectFit, .ScaleAspectFill+剪切超出的图片
比如我使用的是.ScaleAspectFit后的效果是这样的,如图:
为了能更好的观看效果,我把ImageView的backgroundColor设置成了BlackColor
ok,我不喜欢这样的。我们要怎么去除这个黑色的东东,千万不要告诉我,把背景颜色设置whiteColor
进入正题
首选,
我们将 contentModel = .ScaleAspectFit,让图片先自适应UIImageView
第二,
我们换算图片宽与高的比例:let scale: CGFloat = image.width / image.height
第三,
我们比较图片的宽与高的值maxValue,是宽大于高,还是高大于宽,因为.ScaleAspectFit是自适应宽和高其中最大值得(我的个人理解)、
按照上图的,是宽大于高,maxValue = imageValue
第四,
计算UIImageView的高度height
UIImageView和Imag是等比例的,UIImageView.frame.width / UIImageView.frame.height = image.width / image.height
我们可以根据图片的比例值scale和maxValue(maxValue = UIImageView.frame.width)得到公式:
UIImageView.frame.height = maxValue / scale
第五,
设置UIImageView的frame或者bounds
OK,大概的流程是这样的,现在就献上我的代码块
首先要设置UIImageView的frame(或者说是原点Origin的x,y,在我的代码中,我是设置了Origin和bounds)
其次设置图片
返回值是NewFrame,直接在赋值给UIImageView就可以了
1 private func setFrame(frame: CGRect, image: UIImage) -> CGRect{ 2 3 // 判断图片的尺寸是不是小于imageView的尺寸 4 // 如果图片的尺寸小于imageView的尺寸,将图片的尺寸做为imageView的尺寸 5 // 如果图片的尺寸大于imageView的尺寸: 6 // 1、 图片宽与高的比例 scale = width / height 7 // 2、 对比图片宽与高的大小,判断是宽大于高,还是高大于宽; 8 // 3、 如果宽大于高,则需要设置imageView的高,根据图片宽高比scale求imageView得高; 9 // 如果高大于宽,则需要设置imageView的宽,根据图片宽高比scale求imageView的宽; 10 // 注: imageView.contentMode = .ScaleAspectFit 11 12 var _frame: CGRect = CGRect() 13 14 if image.size.width < self.frame.width && image.size.height < self.frame.height { 15 16 _frame = CGRect(x: frame.origin.x, y: frame.origin.y, width: image.size.width, height: image.size.height) 17 } else if image.size.width > self.frame.width && image.size.height > self.frame.height{ 18 19 // 图片宽与高的比例 20 let scaleWH: CGFloat = image.size.width / image.size.height 21 22 // 对比图片宽与高的大小, 宽>高 23 if image.size.width > image.size.height { 24 25 // 根据图片宽高比scale求imageView得高 26 let imageViewHeight: CGFloat = self.frame.width / scaleWH 27 // 设置frame 28 _frame = CGRect(x: frame.origin.x, y: frame.origin.y, width: frame.size.width, height: imageViewHeight) 29 30 }else if image.size.width < image.size.height { 31 32 let imageViewWidth: CGFloat = self.frame.height * scaleWH 33 _frame = CGRect(x: frame.origin.x, y: frame.origin.y, width: imageViewWidth, height: frame.size.width) 34 } 35 } 36 37 return _frame 38 }
无图无真相,上效果图: