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     }

 

無圖無真相,上效果圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM