Swift iOS 圖片自適應,ImageView適應圖片spa
iOS 提供了不少圖片適應ImageView的方法,好比Switf提供的(其實就是少了些單詞而已):code
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+剪切超出的圖片blog
好比我使用的是.ScaleAspectFit後的效果是這樣的,如圖:圖片
爲了能更好的觀看效果,我把ImageView的backgroundColor設置成了BlackColorip
ok,我不喜歡這樣的。咱們要怎麼去除這個黑色的東東,千萬不要告訴我,把背景顏色設置whiteColorrem
進入正題it
首選,io
咱們將 contentModel = .ScaleAspectFit,讓圖片先自適應UIImageViewclass
第二,cli
咱們換算圖片寬與高的比例: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 // 一、 圖片寬與高的比例 scale = width / height 7 // 二、 對比圖片寬與高的大小,判斷是寬大於高,仍是高大於寬; 8 // 三、 若是寬大於高,則須要設置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 }
無圖無真相,上效果圖: