引
在開(kāi)發(fā)中轧抗,我們可能會(huì)遇到這種情況:設(shè)計(jì)做了一張圖,比如是按鈕或文本條的背景疾忍,但由于文字長(zhǎng)度不一乔外,因此按鈕或者文本條大小也會(huì)變化,如果直接設(shè)為背景一罩,那么勢(shì)必導(dǎo)致圖片被拉伸袁稽,如果是整體圖片還沒(méi)什么,但如果是一些特殊的圖片擒抛,比如這種:
由于右下角有一個(gè)箭頭推汽,正常來(lái)說(shuō)不管按鈕怎么變化大小补疑,右下角的區(qū)域都應(yīng)該是固定大小的,這就要求限制該區(qū)域不論圖片怎么拉伸都不拉伸這個(gè)區(qū)域歹撒。
實(shí)現(xiàn)方法
iOS提供了簡(jiǎn)單的方法來(lái)設(shè)置不被拉伸的區(qū)域莲组,是以圖片原本大小上對(duì)應(yīng)區(qū)域來(lái)設(shè)置的,方法為:
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode
這個(gè)方法第一個(gè)參數(shù)接受一個(gè)UIEdgeInsets對(duì)象暖夭,用來(lái)說(shuō)明你要限制不被拉伸的區(qū)域锹杈,其包含四個(gè)參數(shù),分別為圖片中距離上迈着、左竭望、下、右邊界的不拉伸部分的范圍寬度:
UIEdgeInsets insets = UIEdgeInsetsMake(top, left, bottom, right);
也就是說(shuō)裕菠,在我們引言的例子中咬清,我們就需要設(shè)置距離右邊界和下邊界一定距離,確保包含打鉤部分奴潘,使其不被拉伸旧烧。
如果還有其他角落有范圍不想被拉伸,name靈活設(shè)置四個(gè)參數(shù)對(duì)應(yīng)的距離就好了画髓。
上面的方法中第二個(gè)參數(shù)表示拉伸的模式:
- UIImageResizingModeStretch:拉伸模式掘剪,通過(guò)拉伸UIEdgeInsets指定的矩形區(qū)域來(lái)填充圖片
- UIImageResizingModeTile:平鋪模式,通過(guò)重復(fù)顯示UIEdgeInsets指定的矩形區(qū)域來(lái)填充圖片
我們通過(guò)設(shè)置后奈虾,可以得到確保右下角不被拉伸的效果:
圖中上面的是沒(méi)做設(shè)置的夺谁,下面是做了設(shè)置的,可以看出效果很明顯肉微。
代碼如下:
// 不處理的圖片
UIImageView *unHandleImg = [[UIImageView alloc] initWithFrame:CGRectMake((SCREENWIDTH-200)/2, 100, 200, 30)];
unHandleImg.image = [UIImage imageNamed:@"theImage"];
[self.view addSubview:unHandleImg];
// 處理區(qū)域拉伸的圖片
UIImageView *handleImg = [[UIImageView alloc] initWithFrame:CGRectMake((SCREENWIDTH-200)/2, 200, 200, 30)];
UIImage *img = [UIImage imageNamed:@"theImage"];
// 四個(gè)數(shù)值對(duì)應(yīng)圖片中距離上予权、左、下浪册、右邊界的不拉伸部分的范圍寬度
img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(35, 35, 35, 35) resizingMode:UIImageResizingModeStretch];
handleImg.image = img;
[self.view addSubview:handleImg];
需要注意的是扫腺,需要把圖片添加到Assets中,創(chuàng)建對(duì)應(yīng)的圖片集合才能夠生效村象,否則效果是不盡如人意的笆环。
結(jié)
這算是一個(gè)比較常用到的小技巧了,記錄下來(lái)厚者,也希望能夠幫助還不知道的人躁劣。
示例工程:https://github.com/Cloudox/ImageAreaStretchDemo