iOS开发——UI基础-UIImage,UIImageView的使用
1.UIImage
?
創(chuàng)建UIImage的兩種方法
UIImage *image = [UIImage imageNamed:imageNmae];UIImage *image = [UIImage imageWithContentsOfFile:imageNmae]; - imageNamed這個(gè)方法會(huì)自動(dòng)緩存創(chuàng)建的圖片
- 如果圖片不是經(jīng)常使用(比如湯姆貓), 并且圖片非常占用資源, 那么不建議使用imageNamed方法加載圖片
?
imageNamed 與 imageWithContentsOfFile的區(qū)別
如題,是不是大家為了方便都這樣加載圖片啊
myImage = [UIImage imageNamed:@"icon.png"];
那么小心了
這種方法在一些圖片很少,或者圖片很小的程序里是ok的。
但是,在大量加載圖片的程序里,請(qǐng)千萬不要這樣做。
為什么呢 ???????
這種方法在application bundle的頂層文件夾尋找由供應(yīng)的名字的圖象 。 如果找到圖片,裝載到iPhone系統(tǒng)緩存圖象。那意味圖片是(理論上)放在內(nèi)存里作為cache的。
試想你圖片多了,是什么后果``````
圖片cache極有可能不會(huì)響應(yīng) memory warnings and release its objects
所以,用圖片的時(shí)候一定要小心的alloc和release
推薦使用
NSString *path = [[NSBundle mainBundle] pathForResource:@”icon” ofType:@”png”];
myImage = [UIImage imageWithContentsOfFile:path];
?
?
?
用UIImage加載圖像的方法很多,最常用的是下面兩種:
??? 1、用imageNamed函數(shù)
[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的方式加載圖像。其實(shí)這兩種加載方式都有各自的特點(diǎn)。
??? 1)用imageNamed的方式加載時(shí),系統(tǒng)會(huì)把圖像Cache到內(nèi)存。如果圖像比較大,或者圖像比較多,用這種方式會(huì)消耗很大的內(nèi)存,而且釋放圖像的 內(nèi)存是一件相對(duì)來說比較麻煩的事情。例如:如果利用imageNamed的方式加載圖像到一個(gè)動(dòng)態(tài)數(shù)組NSMutableArray,然后將將數(shù)組賦予一 個(gè)UIView的對(duì)象的animationImages進(jìn)行逐幀動(dòng)畫,那么這將會(huì)很有可能造成內(nèi)存泄露。并且釋放圖像所占據(jù)的內(nèi)存也不會(huì)那么簡(jiǎn)單。但是利 用imageNamed加載圖像也有自己的優(yōu)勢(shì)。對(duì)于同一個(gè)圖像系統(tǒng)只會(huì)把它Cache到內(nèi)存一次,這對(duì)于圖像的重復(fù)利用是非常有優(yōu)勢(shì)的。例如:你需要在 一個(gè)TableView里重復(fù)加載同樣一個(gè)圖標(biāo),那么用imageNamed加載圖像,系統(tǒng)會(huì)把那個(gè)圖標(biāo)Cache到內(nèi)存,在Table里每次利用那個(gè)圖 像的時(shí)候,只會(huì)把圖片指針指向同一塊內(nèi)存。這種情況使用imageNamed加載圖像就會(huì)變得非常有效。
??? 2)利用NSData方式加載時(shí),圖像會(huì)被系統(tǒng)以數(shù)據(jù)方式加載到程序。當(dāng)你不需要重用該圖像,或者你需要將圖像以數(shù)據(jù)方式存儲(chǔ)到數(shù)據(jù)庫(kù),又或者你要通過網(wǎng)絡(luò)下載一個(gè)很大的圖像時(shí),請(qǐng)盡量使用imageWithData的方式加載圖像。
??? 無論用哪種方式加載圖像,圖像使用結(jié)束后,一定要記得顯示釋放內(nèi)存。
2.UIImageView
?
- 如果是通過[[UIImageView alloc] init];創(chuàng)建的圖片, 沒有默認(rèn)的寬高
- 但是如果是通過[[UIImageView alloc] initWithImage:image];創(chuàng)建的圖片, 有默認(rèn)的寬高
默認(rèn)的寬高就是圖片的寬高
?
創(chuàng)建一個(gè)UIImageView
方法一:
UIImage *image = [UIImage imageNamed:@"meinv.jpg"];UIImageView *iv = [[UIImageView alloc] initWithImage:image];方法二:
UIImageView *iv = [[UIImageView alloc] init];?
設(shè)置相關(guān)屬性
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語(yǔ)法規(guī)定, 不能直接修改一個(gè)"對(duì)象"的"結(jié)構(gòu)體屬性"的"成員"
iv.frame.size = image.size;// 錯(cuò)誤 先取出 --> 再修改 --> 重新賦值 CGRect tempFrame = iv.frame; tempFrame.size = image.size; iv.frame = tempFrame;?
3.UIViewContentMode
?
- 規(guī)律一:
但凡取值中包含Scale單詞的, 都會(huì)對(duì)圖片進(jìn)行拉伸(縮放)
但凡取值中沒有出現(xiàn)Scale單詞的, 都不會(huì)對(duì)圖片進(jìn)行拉伸
UIViewContentModeScaleToFill,
+ 會(huì)按照UIImageView的寬高比來拉伸圖片
+ 直到讓整個(gè)圖片都填充UIImageView為止
+ 因?yàn)槭前凑誙IImageView的寬高比來拉伸, 所以圖片會(huì)變形
?
- 規(guī)律二:
但凡取值中包含Aspect單詞的, 都會(huì)按照?qǐng)D片的寬高比來拉伸
因?yàn)槭前凑請(qǐng)D片的寬高比來拉伸, 所以圖片不會(huì)變形
UIViewContentModeScaleAspectFit
+ 會(huì)按照?qǐng)D片的寬高比來拉伸
+ 要求整張圖片都必須在UIImageView的范圍內(nèi)
+ 并且寬度和高度其中一個(gè)必須和UIImageView一樣
+ 居中顯示
UIViewContentModeScaleAspectFill,
+ 會(huì)按照?qǐng)D片的寬高比來拉伸
+ 要求整張圖片必須填充UIImageView
+ 并且圖片的寬度或者高度其中一個(gè)必須和UIImageView一樣
?
轉(zhuǎn)載于:https://www.cnblogs.com/chglog/p/4647058.html
總結(jié)
以上是生活随笔為你收集整理的iOS开发——UI基础-UIImage,UIImageView的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D音频播放器 动态装载组件
- 下一篇: ZH奶酪:Python按行读取文件