有了Retina螢幕,App可以呈現更高解析度,更高畫質的圖片。然而美麗是有代價的,一個不小心,可是會開天窗,變成國王的新衣,什麼都看不到! 接下來彼得潘將以LUCY的2張美麗照片為例,說明retina顯示暗藏的致命陷阱。
左邊的圖片為lucy.jpg,右邊為lucy@2x.jpg。聰明的iPhone在顯示圖片時,將根據檔名做判斷,加了@2x的圖片將現身於retina的高解析度螢幕,而少了@2x加持的圖片只有念舊仍然拿著低解析度iPhone的使用者看得到。
因此,當我們執行以下程式碼後,顯示結果如下:
self.imageView.image = [UIImage imageNamed:@"lucy.jpg"];
舊型iPhone (例如iPhone 3GS)
retina糖衣加持的新型iPhone (例如iPhone 5)
雖然念舊是個好習慣,不過有些時候人要向前看,像是為了促進經濟發展買iPhone 5,為了不讓新女友難過忘了舊情人。為了減少App的size,彼得潘決定將lucy.jpg狠心從App刪除,只保留lucy@2x.jpg。如果以剛剛的程式碼在舊型的iPhone再跑一次,結果如下:
iPhone真聰明,自動地將lucy@2x.jpg縮小,顯示於舊解析度的螢幕上。然而條條大路通羅馬,顯示圖片的方法也不只一種,如果採用以下方法,LUCY就像變魔術般,從螢幕上整個消失不見!
NSString *path = [[NSBundle mainBundle] pathForResource:@"lucy.jpg" ofType:nil];
NSLog(@"path %@", path);
self.imageView.image = [[UIImage alloc] initWithContentsOfFile:path];
說明:
線索其實很明顯。印出的Log訊息如下:
path (null)
剛剛的程式碼,我們先取得圖檔的檔案路徑。然後再以UIImage的initWithContentsOfFile: method,傳入檔案路徑來設定顯示的圖片。但別忘了lucy.jpg早已不存在App裡,只留在彼得潘的記憶深處呀。 因為取得的檔案路徑path是空的,因此UIImageView完全不知道要顯示哪一張圖片,也就只能開天窗,一片空白了。
因此,如果堅持要使用 initWithContentsOfFile:來設定顯示的圖片,請記得要加下@2x,如此美麗的LUCY就可以再度出現在我們的眼前了。
NSString *path = [[NSBundle mainBundle] pathForResource:@"lucy@2x.jpg" ofType:nil];
沒有留言:
張貼留言