iOS開發——UI基礎-UIImage,UIImageView的使用


1.UIImage


 

創建UIImage的兩種方法

UIImage *image = [UIImage imageNamed:imageNmae];

UIImage *image = [UIImage imageWithContentsOfFile:imageNmae];

- imageNamed這個方法會自動緩存創建的圖片
- 如果圖片不是經常使用(比如湯姆貓), 並且圖片非常占用資源, 那么不建議使用imageNamed方法加載圖片

 

imageNamed 與 imageWithContentsOfFile的區別

如題,是不是大家為了方便都這樣加載圖片啊

myImage = [UIImage imageNamed:@"icon.png"];
那么小心了
這種方法在一些圖片很少,或者圖片很小的程序里是ok的。
但是,在大量加載圖片的程序里,請千萬不要這樣做。
為什么呢 ???????

這種方法在application bundle的頂層文件夾尋找由供應的名字的圖象 。 如果找到圖片,裝載到iPhone系統緩存圖象。那意味圖片是(理論上)放在內存里作為cache的。

試想你圖片多了,是什么后果``````
圖片cache極有可能不會響應 memory warnings and release its objects

所以,用圖片的時候一定要小心的alloc和release
推薦使用
NSString *path = [[NSBundle mainBundle] pathForResource:@”icon” ofType:@”png”];
myImage = [UIImage imageWithContentsOfFile:path];

 

 

 

用UIImage加載圖像的方法很多,最常用的是下面兩種:

    1、用imageNamed函數

[UIImage imageNamed:ImageName];

    2、用NSData的方式加載,例如:

   1. NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
   2. NSData *image = [NSData dataWithContentsOfFile:filePath];
   3. [UIImage imageWithData:image];

    由於第一種方式要寫的代碼比較少,可能比較多人利用imageNamed的方式加載圖像。其實這兩種加載方式都有各自的特點。

    1)用imageNamed的方式加載時,系統會把圖像Cache到內存。如果圖像比較大,或者圖像比較多,用這種方式會消耗很大的內存,而且釋放圖像的 內存是一件相對來說比較麻煩的事情。例如:如果利用imageNamed的方式加載圖像到一個動態數組NSMutableArray,然后將將數組賦予一 個UIView的對象的animationImages進行逐幀動畫,那么這將會很有可能造成內存泄露。並且釋放圖像所占據的內存也不會那么簡單。但是利 用imageNamed加載圖像也有自己的優勢。對於同一個圖像系統只會把它Cache到內存一次,這對於圖像的重復利用是非常有優勢的。例如:你需要在 一個TableView里重復加載同樣一個圖標,那么用imageNamed加載圖像,系統會把那個圖標Cache到內存,在Table里每次利用那個圖 像的時候,只會把圖片指針指向同一塊內存。這種情況使用imageNamed加載圖像就會變得非常有效。

    2)利用NSData方式加載時,圖像會被系統以數據方式加載到程序。當你不需要重用該圖像,或者你需要將圖像以數據方式存儲到數據庫,又或者你要通過網絡下載一個很大的圖像時,請盡量使用imageWithData的方式加載圖像。

    無論用哪種方式加載圖像,圖像使用結束后,一定要記得顯示釋放內存。

2.UIImageView


 

- 如果是通過[[UIImageView alloc] init];創建的圖片, 沒有默認的寬高

- 但是如果是通過[[UIImageView alloc] initWithImage:image];創建的圖片, 有默認的寬高
默認的寬高就是圖片的寬高

 

創建一個UIImageView

方法一:

UIImage *image = [UIImage imageNamed:@"meinv.jpg"];

UIImageView *iv = [[UIImageView alloc] initWithImage:image];

方法二:

UIImageView *iv = [[UIImageView alloc] init];

 

設置相關屬性

    iv.backgroundColor = [UIColor redColor];
     UIImage *image = [UIImage imageNamed:@"meinv.jpg"];
    iv.image = image;

 

修改控件的frame:

iv.frame = CGRectMake(0, 0, image.size.width, image.size.height);

iv.frame = (CGRect){{0, 0}, {image.size.width, image.size.height}};

 

- OC語法規定, 不能直接修改一個"對象"的"結構體屬性"的"成員"

iv.frame.size = image.size;// 錯誤
先取出 --> 再修改 --> 重新賦值
CGRect tempFrame = iv.frame;
tempFrame.size = image.size;
iv.frame = tempFrame;

 

3.UIViewContentMode


 

- 規律一:
但凡取值中包含Scale單詞的, 都會對圖片進行拉伸(縮放)
但凡取值中沒有出現Scale單詞的, 都不會對圖片進行拉伸
UIViewContentModeScaleToFill,
+ 會按照UIImageView的寬高比來拉伸圖片
+ 直到讓整個圖片都填充UIImageView為止
+ 因為是按照UIImageView的寬高比來拉伸, 所以圖片會變形

 

- 規律二:
但凡取值中包含Aspect單詞的, 都會按照圖片的寬高比來拉伸
因為是按照圖片的寬高比來拉伸, 所以圖片不會變形

UIViewContentModeScaleAspectFit
+ 會按照圖片的寬高比來拉伸
+ 要求整張圖片都必須在UIImageView的范圍內
+ 並且寬度和高度其中一個必須和UIImageView一樣
+ 居中顯示

UIViewContentModeScaleAspectFill,
+ 會按照圖片的寬高比來拉伸
+ 要求整張圖片必須填充UIImageView
+ 並且圖片的寬度或者高度其中一個必須和UIImageView一樣

 


免責聲明!

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



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