顯示具有 iOS image 標籤的文章。 顯示所有文章
顯示具有 iOS image 標籤的文章。 顯示所有文章

2012年10月15日 星期一

六大天王海報牆 - 神乎奇技的圖片重覆排列

圖片可不是只有單純的放大縮小那麼簡單,利用神乎奇技的圖片重覆排列技巧,我們可以設計更有創意,更天馬行空的App畫面。接下來,就讓彼得潘小時候的六大偶像,林隆璇,張智霖,劉德華,梁朝偉,戴佩妮,蔡淳佳,為大家好好表演海報牆的效果吧 !



測試圖片: idol.png  ( 180 pixel * 120 pixel),每個天王各佔 60 * 60 的空間。




UIImage *image = [UIImage imageNamed:@"idol.png"];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 548)];
imageView.image = image;
[self.view addSubview:imageView];

執行App:

尚未施展圖片重覆排列技巧前,圖片呆呆地整個放大到320* 548,每個天王的身材比例都跑掉了 !



圖片重覆排列技巧:

利用UIImage的resizableImageWithCapInsets: method,我們可以控制圖片的縮放,限制圖片的某個區塊維持固定大小,其它未被限定的區塊則以重覆堆疊的方式填滿欲顯示的範圍,例如UIImageView所佔的空間。

resizableImageWithCapInsets:的定義如下:
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

利用UIEdgeInsets型別的capInsets,我們可以控制圖片中維持固定大小的區塊。接下來讓我們經由實際例子,了解UIEdgeInsets的威力吧。

UIImage *image = [[UIImage imageNamed:@"idol.png"]     
                  resizableImageWithCapInsets:UIEdgeInsetsMake(0, 60, 0, 0)];

利用UIEdgeInsetsMake(0, 60, 0, 0)建立capInsets。其定義如下:
UIEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right)

剛剛的例子裡,表示我們希望圖片裡距離左邊界60 points的區塊維持固定大小。讓我們先偷看結果,再來說明。

執行App:

從下圖我們看到林隆璇和梁朝偉固定在第一個column休息,但其它4個偶像卻要辛苦地重覆排列將畫面填滿。這是因為林隆璇和梁朝偉所佔據的空間正是距離左邊界60 points的區塊,所以他們享有特權,可以維持原狀,不用分擔填滿畫面的重擔。



讓我們試試同時設定左邊和右邊各60 points,看看有何變化。

UIImage *image = [[UIImage imageNamed:@"idol.png"] 
                resizableImageWithCapInsets:UIEdgeInsetsMake(0, 60, 0, 60)];


執行App:

這一次佔據距離左邊界60 points的林隆璇和梁朝偉,以及佔距離右邊界60 points的劉德華和蔡淳佳都可以維持原狀休息,只有居中的張智霖和戴佩妮要獨自負責填滿畫面的重責大任,真是辛苦他們了。



一直顧左右也不是辦法,讓我們換個方向,試試設定距離上邊界60 points吧。

UIImage *image = [[UIImage imageNamed:@"idol.png"] 
               resizableImageWithCapInsets:UIEdgeInsetsMake(60, 0, 0, 0)];

執行App:

輪到距離上邊界60 points的林隆璇,張智霖和劉德華可以休息了,剩下其它三個人繼續辛勞地填滿畫面。



為了公平起見,再換個方向,設定距離下邊界60 points吧。

UIImage *image = [[UIImage imageNamed:@"idol.png"] 
                resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 60, 0)];



執行App:

風水輪流轉,梁朝偉,戴佩妮,蔡淳佳終於可以休息了,換剛剛在一旁閒很久的三個人來重覆排列填滿畫面了。




2012年7月15日 星期日

讓帶來消暑涼意的雪后露臉吧 - 圖片的裁切和遮罩



Peggy的雪后音樂劇即將在炎熱的8月演出,
為我們帶來消暑的涼意。
為了感謝Peggy,
彼得潘決定在iPhone上宣傳雪后的演出。




執行結果:


想不到雪后的宣傳照太大張了,
足足有849*313 (pixel)
遠超過320*480的iPhone螢幕大小。
因此我們只看到左半邊的演出日期。

宣傳照片裡的最吸引人目光的莫過於可愛的雪后圖案了。
接下來彼得潘將利用圖片裁切的技巧,
特別剪裁出雪后的區塊。





說明:

CGRect rect = CGRectMake(310, 20, 320, 280);
CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect);

利用CGImageCreateWithImageInRect,裁切出原圖大小中,從x, y (310, 20)開始,寬高(320, 280)的長方形區塊。



執行結果:



太好了,雪后終於露臉了!  可惜的是雪后標題還是看不到,不知情的人可能還誤以為這是新版的白雪公主。因此彼得潘決定另外做一個圓形的雪后標題版以正視聽。為了將圖片做成可愛的圓形,在此彼得潘採用mask的技巧。mask的圓形圖片如下,到時候和雪后圖片起化學作用後,將只呈現圓形的部分。(一般做為mask的圖片,顏色將設為黑色。)





說明:


 CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef),
                                        NULL, // decode should be NULL
                                        FALSE // shouldInterpolate
                                        );

 CGImageRef masked = CGImageCreateWithMask(imageRef, mask);


利用CGImageMaskCreate和CGImageCreateWithMask對原圖做mask。


執行結果:




2012年4月18日 星期三

難纏的兔子王 - UIViewContentModeScaleAspectFill的陷阱


彼得潘的畫家友人Jorinde Jankowski (張友鷦) 有天突發奇想,
將結在樹上的Apple換成了可愛的兔子。




不過彼得潘身為蘋果迷,
當然想將兔子換回原先的蘋果。
所謂擒賊先擒王,
樹中間的兔子是我們的首要目標。
接下來彼得潘將利用UIViewContentModeScaleAspectFill,
只顯示圖片的中間區塊,
排除中間的兔子王。


利用UIViewContentModeScaleAspectFill以及將frame設為300*150,
應該可以讓原本577 * 722圖片縮放至300* 375 ( 375 = 722*300/577.0)
並且以中心為準切除上半部和下半部各112.5。
然而程式執行後,
結局卻出乎意料



沒想到,
竟然顯示完整的圖片,
圖片的大小和位置,
完全不是設定的(10, 180, 300, 150),
更可惡的,
彼得潘的眼中釘,中間的兔子王還在。
為了找出問題,
彼得潘再加上一塊半透明的長方形,
此長方形的frame設定為和彼得潘想要的圖片frame一致。




如上圖所示,
彼得潘想要的圖片大小和位置,
其實是圖片的中間區塊。
實現願望其實很簡單,
只要加入以下程式碼即可 

    imageView.clipsToBounds = YES;

clipsToBounds的預設值是NO,
將其設為YES,
即可讓超出範圍的部分被活生生的割除!


若是從Storyboard建立的ImageView,
在將Mode設為Scale To Fill時,
顯示的預覽將是手術成功後的結果。


不過想不到彼得潘又上當了,
由於Clip Subviews沒有勾選,
實際執行時顯示的還是手術前的模樣,
兔子王還是得意地在樹上搖擺。
因此,
記得要勾選Clip Subviews,
它的效果等同於將clipsToBounds設為YES。