在iOS開發(fā)中,經(jīng)常碰到需要根據(jù)網(wǎng)絡(luò)圖片的大小動態(tài)調(diào)整高度的情況,目前我能想到的有以下思路:
1.和服務(wù)端商量,接口中直接返回圖片的size
優(yōu)點:可直接食用,安全無毒。
缺點:有的服務(wù)端沒有做好這方面的預(yù)留,需要改挺多代碼,人家未必愿意??。
2.直接根據(jù)鏈接獲取圖片的NSData,并轉(zhuǎn)成UIImage獲取圖片大小,如果有使用SDWebImage,則使用SDWebImage緩存該圖片
優(yōu)點:無需從服務(wù)端接口獲取圖片大小,適用性廣。
缺點:如果圖片較大,會花很多時間在下載圖片上,主線程UI的繪制,如果網(wǎng)速不好的話會影響用戶體驗。
3.使用SDWebImage,先判斷圖片是否在緩存中,如果在緩存中,直接獲取圖片高度,如果不在緩存中,先預(yù)設(shè)一個高度,顯示圖片時異步下載圖片,下載完成后刷新控件
優(yōu)點:可以明顯縮短加載時間
缺點:可能會產(chǎn)生跳動,影響體驗
4.通過文件頭獲取圖片大小(針對格式為png、gif、jpg文件獲取其尺寸大小),如果獲取失敗,則下載完整圖片的NSData,然后轉(zhuǎn)成UIImage獲取圖片大小,如果有使用SDWebImage,則使用SDWebImage緩存該圖片
優(yōu)點:相比2來說,獲取頭文件速度會快很多
缺點:雖然獲取頭文件耗時比下載圖片快很多,但是還是有延遲,會阻塞主線程UI的繪制,如果網(wǎng)速不好的話會影響用戶體驗。
對于1、2的實現(xiàn),都是很簡單的,這里不做贅述。
關(guān)于方法3,不同情景下的代碼不同這里也不好給出代碼。
所以我就把方法4封裝成IUIImage的一個擴展方法,這里給出代碼地址,希望能幫到大家:
關(guān)于以上方案的選擇,個人認為,如果有較大的圖片,可以采用方法3,如果圖片不大,且一次獲取的數(shù)量也不是很多的話,用方法4會方便很多。當然,如果你有更好的方法,煩請聯(lián)系我或者留言讓我知曉,在此謝過。
參考文章:
http://blog.sina.com.cn/s/blog_134451adb0102whkf.html