iOS中拉伸圖片的幾種方式

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:https://yotrolz.com/posts/5fe4e0ec/


假如下面的一張圖片锭吨,是用來做按鈕的背景圖片的纹冤,原始尺寸是(128 * 112)

按鈕背景圖片.png

我們通過代碼將這張圖片設(shè)置為按鈕的背景圖片,假如我們將創(chuàng)建好的按鈕的寬高設(shè)置為:(W=200, H=50)代碼如下:

//
//  ViewController.m
//  iOS圖片拉伸總結(jié)
//
//  Copyright (c) 2015年 YotrolZ. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 創(chuàng)建一個按鈕
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

    // 設(shè)置按鈕的frame
    btn.frame = CGRectMake(100, 300, 200, 50);
    
    // 加載圖片
    UIImage *image = [UIImage imageNamed:@"chat_send_nor"];
    
    // 設(shè)置按鈕的背景圖片
    [btn setBackgroundImage:image forState:UIControlStateNormal];
    
    // 將按鈕添加到控制器的view
    [self.view addSubview:btn];
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

這是你發(fā)現(xiàn)運行的結(jié)果完全出乎你的意料(搓的無極限)扶镀,如圖:


運行效果圖1.png

原因分析:是將原是尺寸為W=128 * H=112的圖片拉伸成了W=200, H=50;
解決方案:
1.找美工MM重做一張較大的圖片,這樣的話就會出現(xiàn)軟件包將來會變大,占用空間更大;如果我們要經(jīng)常修改按鈕的frame,你是想讓MM殺你的節(jié)奏~~,顯然不可行焰轻;
2.蘋果為我們提供了關(guān)于圖片拉伸的API臭觉,我們可以直接利用代碼實現(xiàn),是不是很牛X辱志;

利用蘋果提供的API來拉伸圖片(目前發(fā)現(xiàn)的有四種):
一蝠筑、 方式一(iOS5之前):
如下圖:設(shè)置topCapHeightleftCapWidth揩懒、bottomCapHeight什乙、lerightCapWidth,圖中的黑色區(qū)域就是圖片拉伸的范圍,也就是說邊上的不會被拉伸.
通過下面的方法我們可以設(shè)置:

// 官方API說明
// - stretchableImageWithLeftCapWidth:topCapHeight:(iOS 5.0)
// Creates and returns a new image object with the specified cap values.

說明:這個方法只有2個參數(shù)已球,leftCapWidth代表左端蓋寬度臣镣,topCapHeight代表上端蓋高度辅愿。系統(tǒng)會自動計算出右端蓋寬度rightCapWidth和底端蓋高度bottomCapHeight,算法如下:

// 系統(tǒng)會自動計算rightCapWidth
rightCapWidth = image.width - leftCapWidth - 1;  
  
// 系統(tǒng)會自動計算bottomCapHeight
bottomCapHeight = image.height - topCapHeight - 1 

這樣一來忆某,其實我們圖片的可拉伸范圍只有1 * 1点待,所以再怎么拉伸都不會影響圖片的外觀;
具體代碼如下:

    // 加載圖片
    UIImage *image = [UIImage imageNamed:@"chat_send_nor"];
    
    // 設(shè)置左邊端蓋寬度
    NSInteger leftCapWidth = image.size.width * 0.5;
    // 設(shè)置上邊端蓋高度
    NSInteger topCapHeight = image.size.height * 0.5;
    
    UIImage *newImage = [image stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:topCapHeight];
    
    // 設(shè)置按鈕的背景圖片
    [btn setBackgroundImage:newImage forState:UIControlStateNormal];

運行效果:


運行效果圖2.png

方式二:(iOS5)
利用下面的方法:

// 官方API說明
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets NS_AVAILABLE_IOS(5_0); 
// create a resizable version of this image. the interior is tiled when drawn.
typedef struct UIEdgeInsets {
    CGFloat top, left, bottom, right;  
    // specify amount to inset (positive) for each of the edges. values can be negative to 'outset'
} UIEdgeInsets;

說明:UIEdgeInsets中的CGFloat top, left, bottom, right就是用來設(shè)置上端蓋、左端蓋弃舒、下端蓋癞埠、右端蓋的尺寸(逆時針方向);

具體代碼如下:

    // 加載圖片
    UIImage *image = [UIImage imageNamed:@"chat_send_nor"];
    
    // 設(shè)置端蓋的值
    CGFloat top = image.size.height * 0.5;
    CGFloat left = image.size.width * 0.5;
    CGFloat bottom = image.size.height * 0.5;
    CGFloat right = image.size.width * 0.5;
    
    UIEdgeInsets edgeInsets = UIEdgeInsetsMake(top, left, bottom, right);
    
    // 拉伸圖片
    UIImage *newImage = [image resizableImageWithCapInsets:edgeInsets];
    
    // 設(shè)置按鈕的背景圖片
    [btn setBackgroundImage:newImage forState:UIControlStateNormal];

運行效果:


運行效果圖3.png

方式三:(iOS6)
利用下面的方法:

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode NS_AVAILABLE_IOS(6_0); 
// the interior is resized according to the resizingMode

說明:相比iOS5中的方法多了一個resizingMode參數(shù)

typedef NS_ENUM(NSInteger, UIImageResizingMode) {
    UIImageResizingModeTile, // 平鋪模式,通過重復(fù)顯示UIEdgeInsets指定的矩形區(qū)域來填充圖片
    UIImageResizingModeStretch, // 拉伸模式聋呢,通過拉伸UIEdgeInsets指定的矩形區(qū)域來填充圖片
};

具體代碼如下:

    // 加載圖片
    UIImage *image = [UIImage imageNamed:@"chat_send_nor"];
    
    // 設(shè)置端蓋的值
    CGFloat top = image.size.height * 0.5;
    CGFloat left = image.size.width * 0.5;
    CGFloat bottom = image.size.height * 0.5;
    CGFloat right = image.size.width * 0.5;
    
    // 設(shè)置端蓋的值
    UIEdgeInsets edgeInsets = UIEdgeInsetsMake(top, left, bottom, right);
    // 設(shè)置拉伸的模式
    UIImageResizingMode mode = UIImageResizingModeStretch;
    
    // 拉伸圖片
    UIImage *newImage = [image resizableImageWithCapInsets:edgeInsets resizingMode:mode];
    
    // 設(shè)置按鈕的背景圖片
    [btn setBackgroundImage:newImage forState:UIControlStateNormal];

運行效果:

運行效果圖4.png

方式4:(最簡單的一種方式)


設(shè)置slicing屬性.png

設(shè)置后.png

是不是So easy~~

運行效果:

運行效果5.png

備注:上面所有通過代碼來拉伸圖片的方法都是返回一個拉伸后的新圖片.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苗踪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子削锰,更是在濱河造成了極大的恐慌通铲,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喂窟,死亡現(xiàn)場離奇詭異测暗,居然都是意外死亡,警方通過查閱死者的電腦和手機磨澡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門碗啄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人稳摄,你說我怎么就攤上這事稚字。” “怎么了厦酬?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵胆描,是天一觀的道長。 經(jīng)常有香客問我仗阅,道長昌讲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任减噪,我火速辦了婚禮短绸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筹裕。我一直安慰自己醋闭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布朝卒。 她就那樣靜靜地躺著证逻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抗斤。 梳的紋絲不亂的頭發(fā)上囚企,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天丈咐,我揣著相機與錄音,去河邊找鬼洞拨。 笑死扯罐,一個胖子當(dāng)著我的面吹牛负拟,可吹牛的內(nèi)容都是我干的烦衣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掩浙,長吁一口氣:“原來是場噩夢啊……” “哼花吟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厨姚,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤衅澈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谬墙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體今布,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年拭抬,在試婚紗的時候發(fā)現(xiàn)自己被綠了部默。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡造虎,死狀恐怖傅蹂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情算凿,我是刑警寧澤份蝴,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站氓轰,受9級特大地震影響婚夫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜署鸡,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一案糙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧储玫,春花似錦侍筛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至端礼,卻和暖如春禽笑,著一層夾襖步出監(jiān)牢的瞬間入录,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工佳镜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留僚稿,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓蟀伸,卻偏偏與公主長得像蚀同,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子啊掏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫蠢络、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,094評論 4 62
  • 縱觀移動市場迟蜜,一款移動app刹孔,要想長期在移動市場立足,最起碼要包含以下幾個要素:實用的功能娜睛、極強的用戶體驗髓霞、華麗簡...
    木馬不在轉(zhuǎn)閱讀 512評論 0 0
  • 讀書有三種類型方库,一是享受趣味,二是獲取新知兢交,三是改變?nèi)松胶础_@本書講述的就是如何通過讀書改變?nèi)松Wx書過程分為三個階...
    拾憶芳華閱讀 280評論 0 2
  • 對于我 想喝酒 可以有 酒店 餐館 大排檔 還有獨居的 小屋 紅星二鍋頭 茅臺 或是南非的紅酒 還有 比利時啤...
    沿海而行閱讀 221評論 0 0
  • 湖邊風(fēng)兒吹 吹的頭發(fā)癢 臉蛋冰冰涼 前方路漫長 腳步不可擋 快樂奔健康 歌兒輕輕唱 抬頭望月亮 默默把你想 想你在...
    開心果_6e66閱讀 123評論 0 0