返回一張受保護(hù)且被拉伸的圖片
應(yīng)用場景:聊天窗口的氣泡
方法一(棄用):
iOS 5.0以前使用(棄用)這個方法會自動計算出偏向中間的一個1*1的方格也就是被拉伸的地方(默認(rèn)使用拉伸),一般傳入的值為圖片大小的一半.
[image stretchableImageWithLeftCapWidth:imageHeight *0.5 topCapHeight:imageHeight *0.5 ];
方法二(常用):
將圖片沒有保護(hù)的部分進(jìn)行拉伸。
上下左右的值定義了受保護(hù)區(qū)域,能被拉伸的地方是中間區(qū)域,一般我們都設(shè)成中心點為了安全。
// 1. 直接傳入保護(hù)的范圍,沒有設(shè)置圖拉伸的模式,默認(rèn)為UIImageResizingModeTile(瓦片式)就是將圖片以原來的大小就行平鋪顯示
[image resizableImageWithCapInsets:UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)];
// 2. 設(shè)置圖片拉伸的模式
// UIImageResizingModeTile平鋪 UIImageResizingModeStretch拉伸
[image resizableImageWithCapInsets:UIEdgeInsetsMake(imageheight * 0.5, imagewidth * 0.5, imageheight * 0.5 -1, imagewidth * 0.5 - 1) resizingMode:UIImageResizingModeTile];
傳入的第一個參數(shù)capInsets
是UIEdgeInsets
類型的數(shù)據(jù): UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)
這個參數(shù)是一個結(jié)構(gòu)體,定義如下
typedef struct { CGFloat top, left , bottom, right ; } UIEdgeInsets;
該參數(shù)的意思是被保護(hù)的區(qū)域到原始圖像外輪廓的上部,左部,底部,右部的直線距離
比如 UIEdgeInsetsMake(42, 0, 0, 0) 指的是拉伸區(qū),詳細(xì)點解釋就是,從頂部一直到y(tǒng)=42部分是保護(hù)區(qū),從y=42一直到底部是拉伸區(qū)
對于拉伸的方式,有以下兩種:
typedef NS_ENUM(NSInteger, UIImageResizingMode) {
UIImageResizingModeTile,(瓦片)
UIImageResizingModeStretch,(伸展)
};
-
IUIImageResizingModeStretch
:拉伸模式,通過拉伸UIEdgeInsets
指定的矩形區(qū)域來填充圖片 -
UIImageResizingModeTile
:平鋪模式(瓦片),通過重復(fù)顯示UIEdgeInsets
指定的矩形區(qū)域來填充圖片
來做四個測試,假如我們的原始圖像尺寸為60*128
原始圖像
在一個 180 * 384 的窗口進(jìn)行測試圖像
測試的界面設(shè)計如圖
正上方為原始圖像窗口,用于顯示原始圖像的效果
左下方為測試圖像窗口,用于顯示測試狀況的效果
右下方為對比圖像窗口,用于顯示默認(rèn)狀況的效果
測試軟件的界面設(shè)計
當(dāng)我們設(shè)置capInsets
為以下四種值的時候有什么樣子的效果: - 1:
capInsets
參數(shù)為UIEdgeInsetsMake(0, 0, 0, 0)
- 2:
capInsets
參數(shù)為UIEdgeInsetsMake(42, 0, 0, 0)
- 3:
capInsets
參數(shù)為UIEdgeInsetsMake(0, 20, 0, 0)
- 4:
capInsets
參數(shù)為UIEdgeInsetsMake(42, 20, 42, 20)
拉伸模式
resizingMode參數(shù)為UIImageResizingModeStretch
1.capInsets參數(shù)為UIEdgeInsetsMake(0, 0, 0, 0)時
當(dāng)我們向拉伸方法傳入該組參數(shù)時,代表我們未對原始圖像的任何區(qū)域進(jìn)行保護(hù).其拉伸效果如圖
在該種情況下,我們發(fā)現(xiàn)原始圖像按比例放大了3倍,因此我們將該情況當(dāng)做拉伸模式下的默認(rèn)狀況
在之后的實驗中,我們將該種狀況當(dāng)做參考對象,顯示在界面的右下角
2.capInsets參數(shù)為UIEdgeInsetsMake(42, 0, 0, 0)時
當(dāng)我們向拉伸方法傳入該組參數(shù)時,代表我們對原始圖像上部的三分之一進(jìn)行保護(hù)(即紅色方塊區(qū)域).其拉伸效果如圖
在該種情況下,我們可以發(fā)現(xiàn)拉伸后的圖像中:
- 原始圖像中受保護(hù)的區(qū)域(即紅色方塊區(qū)域)在Y軸方向保持了原比例,但在X軸方向進(jìn)行了拉伸
-
原始圖像中未受保護(hù)的區(qū)域,直接按比例進(jìn)行了拉伸
Stretch實驗結(jié)果2.png
3.capInsets參數(shù)為UIEdgeInsetsMake(0,20, 0, 0)時
當(dāng)我們向拉伸方法傳入該組參數(shù)時,代表我們對原始圖像左部的三分之一進(jìn)行保護(hù)(即紅色方塊區(qū)域).其拉伸效果如圖
在該種情況下,我們可以發(fā)現(xiàn)拉伸后的圖像中:
- 原始圖像中受保護(hù)的區(qū)域(即紅色方塊區(qū)域)在X軸方向保持了原比例,但在Y軸方向進(jìn)行了拉伸
-
原始圖像中未受保護(hù)的區(qū)域,直接按比例進(jìn)行了拉伸
Stretch實驗結(jié)果3.png
4.capInsets參數(shù)為UIEdgeInsetsMake(42, 20, 42, 20)時
當(dāng)我們向拉伸方法傳入該組參數(shù)時,代表我們對原始圖像除數(shù)字5以外的區(qū)域進(jìn)行保護(hù)(即兩個紅色方塊圍起來的區(qū)域).其拉伸效果如圖
在該種情況下,我們可以發(fā)現(xiàn)拉伸后的圖像中:
- 在X軸上,由于1被左邊和上邊的設(shè)置保護(hù),3被右邊和上邊的設(shè)置保護(hù),所以只能用中間的2來拉伸,同理最底下的7,8,9
- 在Y軸上,由于1被左邊和上邊的設(shè)置保護(hù),7被左邊和下邊的設(shè)置保護(hù),所以只能用中間的4來拉伸,同理最底下的3,6,9
-
由于5沒有被保護(hù),所以在整個剩余的空間中,用5進(jìn)行拉伸填充
Stretch實驗結(jié)果4.png
選擇平鋪模式
resizingMode參數(shù)為UIImageResizingModeTile
1.capInsets參數(shù)為UIEdgeInsetsMake(0, 0, 0, 0)時
當(dāng)我們向拉伸方法傳入該組參數(shù)時,代表我們未對原始圖像的任何區(qū)域進(jìn)行保護(hù).其平鋪效果如圖
在該種情況下,我們發(fā)現(xiàn)原始圖像按比例填充了相框,因此我們將該情況當(dāng)做拉伸模式下的默認(rèn)狀況
在之后的實驗中,我們將該種狀況當(dāng)做參考對象,顯示在界面的右下角
2.capInsets參數(shù)為UIEdgeInsetsMake(42, 0, 0, 0)時
當(dāng)我們向拉伸方法傳入該組參數(shù)時,代表我們對原始圖像上部的三分之一進(jìn)行保護(hù)(即紅色方塊區(qū)域).其平鋪效果如圖
在該種情況下,我們可以發(fā)現(xiàn)拉伸后的圖像中:
- 原始圖像中受保護(hù)的區(qū)域(即紅色方塊區(qū)域)在Y軸方向保持了原比例,但在X軸方向進(jìn)行了平鋪填充
-
原始圖像中未受保護(hù)的區(qū)域,直接按比例進(jìn)行了平鋪,但不包含被保護(hù)的區(qū)域(注意觀察藍(lán)色箭頭所指的區(qū)域)
Tile測試2.png
3.capInsets參數(shù)為UIEdgeInsetsMake(0,20, 0, 0)時
當(dāng)我們向拉伸方法傳入該組參數(shù)時,代表我們對原始圖像左部的三分之一進(jìn)行保護(hù)(即紅色方塊區(qū)域).其平鋪效果如圖4.2.3
在該種情況下,我們可以發(fā)現(xiàn)拉伸后的圖像中:
- 原始圖像中受保護(hù)的區(qū)域(即紅色方塊區(qū)域)在X軸方向保持了原比例,但在Y軸方向進(jìn)行了平鋪填充
-
原始圖像中未受保護(hù)的區(qū)域,直接按比例進(jìn)行了平鋪,但不包含被保護(hù)的區(qū)域(注意觀察藍(lán)色箭頭所指的區(qū)域)
Tile測試3.png
4.capInsets參數(shù)為UIEdgeInsetsMake(42, 20, 42, 20)時
當(dāng)我們向拉伸方法傳入該組參數(shù)時,代表我們對原始圖像除數(shù)字5以外的區(qū)域進(jìn)行保護(hù)(即兩個紅色方塊圍起來的區(qū)域).其拉伸效果如圖
在該種情況下,我們可以發(fā)現(xiàn)拉伸后的圖像中:
- 在X軸上,由于1被左邊和上邊的設(shè)置保護(hù),3被右邊和上邊的設(shè)置保護(hù),所以只能用中間的2來平鋪,同理最底下的7,8,9
- 在Y軸上,由于1被左邊和上邊的設(shè)置保護(hù),7被左邊和下邊的設(shè)置保護(hù),所以只能用中間的4來平鋪,同理最底下的3,6,9
-
由于5沒有被保護(hù),所以在整個剩余的空間中,用5進(jìn)行平鋪填充
Tile測試4.png
結(jié)論和建議
通過8組實驗數(shù)據(jù)可以觀察出拉伸方法在平鋪模式和拉伸模式下的變化過程和主要區(qū)別,由此我們可知:
- 對原始圖形使用拉伸方法且在四周增加保護(hù)區(qū)域后,能保證原始圖形的四個角不失真,但其余部分的變化細(xì)節(jié)則有不同
- 如果原始圖像的外輪廓不平整的話,使用拉伸方式會讓外輪廓的不平整度放大,使用平鋪方式應(yīng)該能減小這種情況
測試代碼:
使用了Storyboard搭建軟件界面
#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView1;
@property (weak, nonatomic) IBOutlet UIImageView *imageView2;
@property (weak, nonatomic) IBOutlet UIImageView *imageView3;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//--imageView1的相關(guān)內(nèi)容------------------------------------------------------------------------------------
//相框大小為60 * 128 圖片尺寸為60 * 128
//讀取圖片
UIImage *testImage1 = [UIImage imageNamed:@"123456789"];
testImage1 = [testImage1 resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeStretch];
self.imageView1.image = testImage1;
//---imageView2的相關(guān)內(nèi)容-----------------------------------------------------------------------------------
//相框為180 * 384 圖片尺寸為60 * 128 相框大小為原始圖片的3倍
//讀取圖片
UIImage *testImage2 = [UIImage imageNamed:@"123456789"];
/***********************************************/
//方法1 resizableImageWithCapInsets:默認(rèn)是平鋪
//方法2 resizableImageWithCapInsets: resizingMode: 方法
// UIImageResizingModeTile, 平鋪
//平鋪的概念是保證原圖像大小不變,將新圖像填充滿
//testImage2 = [testImage2 resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeTile];
//將上部的三分之一"保護(hù)",然后進(jìn)行顯示
//這代表新圖像中,上部的三分之一和原圖像一樣,而其余部分的填充不會使用原圖像上部的三分之一
// testImage2 = [testImage2 resizableImageWithCapInsets:UIEdgeInsetsMake(42, 0, 0, 0) resizingMode:UIImageResizingModeTile];
//將左部的三分之一"保護(hù)",然后進(jìn)行顯示
//這代表新圖像中,上部的三分之一和原圖像一樣,而其余部分的填充不會使用原圖像上部的三分之一
// testImage2 = [testImage2 resizableImageWithCapInsets:UIEdgeInsetsMake(0,20, 0, 0) resizingMode:UIImageResizingModeTile];
//將四周進(jìn)行保護(hù)后
//在X軸上,由于1被左邊的設(shè)置保護(hù),3被右邊的設(shè)置保護(hù),所以中間只能用2來平鋪,同理,7和9之間的8
//在Y軸上,由于1被上邊的設(shè)置保護(hù),7被下邊的設(shè)置保護(hù),所以中間只能用4來平鋪,同理,3和9之間的6
//由于5沒有被保護(hù),所以在整個空間中,用5進(jìn)行平鋪來填充剩余的區(qū)域
// testImage2 = [testImage2 resizableImageWithCapInsets:UIEdgeInsetsMake(42, 20, 42, 20) resizingMode:UIImageResizingModeTile];
/***********************************************/
//resizableImageWithCapInsets: resizingMode: 方法
// UIImageResizingModeStretch, 拉伸
// 拉伸的概念是直接按比例將圖片放大到與相框尺寸相同的圖像,
//testImage2 = [testImage2 resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeStretch];
//將上部的三分之一"保護(hù)",然后進(jìn)行顯示
//保證原圖像上部的三分之一在Y軸上不被拉伸,其余部分按剩余比例拉伸
//testImage2 = [testImage2 resizableImageWithCapInsets:UIEdgeInsetsMake(42, 0, 0, 0) resizingMode:UIImageResizingModeStretch];
//將左部的三分之一"保護(hù)",然后進(jìn)行顯示
//保證原圖像左部的三分之一在Y軸上不被拉伸,其余部分按剩余比例拉伸
//testImage2 = [testImage2 resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20, 0, 0) resizingMode:UIImageResizingModeStretch];
//將四周進(jìn)行保護(hù)后
//在X軸上,由于1被左邊的設(shè)置保護(hù),3被右邊的設(shè)置保護(hù),所以中間只能用2來拉伸,同理,7和9之間的8
//在Y軸上,由于1被上邊的設(shè)置保護(hù),7被下邊的設(shè)置保護(hù),所以中間只能用4來拉伸,同理,3和9之間的6
//由于5沒有被保護(hù),所以在整個空間中,用5進(jìn)行拉伸來填充剩余的區(qū)域
//testImage2 = [testImage2 resizableImageWithCapInsets:UIEdgeInsetsMake(42, 20, 42, 20) resizingMode:UIImageResizingModeStretch];
//將圖片添加到相框
self.imageView2.image = testImage2;
//-----imageView3的相關(guān)內(nèi)容----------------------------------------------------------------------------------
//讀取圖片
UIImage *testImage3 = [UIImage imageNamed:@"123456789"];
/***********************************************/
//resizableImageWithCapInsets默認(rèn)是平鋪
//resizableImageWithCapInsets默認(rèn)情況對比圖
//testImage3 = [testImage3 resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeTile];
/***********************************************/
//resizableImageWithCapInsets: resizingMode: 方法
// UIImageResizingModeTile, 平鋪 (已經(jīng)測試過了,)
// UIImageResizingModeStretch, 拉伸
//testImage3 = [testImage3 resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeStretch];
/***********************************************/
//將圖片添加到相框
self.imageView3.image = testImage3;
// Do any additional setup after loading the view, typically from a nib.
}
@end
方法三:
Image Slicing 可視化縮放
相當(dāng)于一個可視化的resizableImageWithCapInsets
,可以用于指定在圖片縮放時用來填充的像素。我們可以在Xcode
的Assets.xcassets
目錄中選擇要slicing
的圖片,點擊圖片界面右下方的Show Slicing
按鈕,在想要設(shè)定切片的圖片上點擊Start Slicing
,將出現(xiàn)左中右(或者上中下)三條可以拖動的指示線,通過拖動它們來設(shè)定實際的縮放范圍。
他是可視化的resizableImageWithCapInsets,那么它的capInsets在哪里呢?打開圖片對應(yīng)的.json文件,代碼如下:
{
"images" : [
{
"resizing" : {
"mode" : "9-part",
"center" : {
"mode" : "tile",
"width" : 42,
"height" : 92
},
"cap-insets" : {
"bottom" : 0,
"top" : 95,
"right" : 41,
"left" : 0
}
},
從文件可以看出來top
、left
、bottom
、right
對應(yīng)的就是上左下右的指示線,看到mode
為tile
,就知道Image Slicing
默認(rèn)為平鋪縮放,對于width
與Height
是做什么的呢?Width
代表的是左側(cè)線(或者上方線)和中間線之間的區(qū)域,Height
代表的是上側(cè)線和中間線之間的區(qū)域。
做個測試:
這是一張2倍像素的圖片,我把它拖入
Assets.xcassets
中。選擇右下角Slices
的類型為Horizontal and Vertical
:左側(cè)ShowSlicing顯示如下:
在
storyboard
拖入一個ImageView
,上下左右距離邊框均為20。則顯示如下:簡單來記就是縱橫各三條線,線之外的四個角不會拉伸。六條線內(nèi)部交匯處,亮色區(qū)域為拉伸區(qū)域,灰色蒙版區(qū)域被截取掉,不顯示。
如果在Xib或者StoryBoard中可以通過View 的Stretching屬性來設(shè)置。
UIEdgeInsetsMake使用例子
在創(chuàng)建button的時候經(jīng)常需要在button上添加圖片和按鈕,而且一般情況下我們需要的都是圖片在上、標(biāo)題在下的效果(灰色的為button):
而當(dāng)我們設(shè)置好title和image后發(fā)現(xiàn)是圖片居左,標(biāo)題居右的:
當(dāng)然這不是我們想要的效果,于是通過設(shè)置
UIEdgeInsetsMake
屬性來達(dá)到我們想要的效果
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;
UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)要設(shè)置的就是四個邊距
圖中,藍(lán)色標(biāo)識為可變區(qū)域, 綠色標(biāo)識為不變區(qū)域。
上面的圖片來自于一葉博客
可以這樣理解:
top
就是距離頂部的距離在默認(rèn)的基礎(chǔ)上又加上設(shè)置的距離,拿開頭的button來說,在button僅設(shè)置image的時候(如果同時設(shè)置了image和title效果又是不一樣的,下面會詳解,稍安勿躁),image默認(rèn)是居中的,相當(dāng)于進(jìn)行了這樣的設(shè)置:
[button setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
如果我們在這個時候設(shè)置了:
[button setImageEdgeInsets:UIEdgeInsetsMake(20, 0, 0, 0)];
就相當(dāng)于在圖片居中的基礎(chǔ)上,將圖片又下移了20,如果是-20則是在原有的基礎(chǔ)上向上移20,其他幾個參數(shù)同理,正數(shù)就是距相應(yīng)的邊的距離增加,負(fù)數(shù)就是距相應(yīng)的距離減少。
為button同時設(shè)置圖片和標(biāo)題
當(dāng)我們給button設(shè)置圖片和title的時候默認(rèn)是圖片居左,標(biāo)題距右并排排列的
當(dāng)我們同時添加圖片和標(biāo)題時,圖片默認(rèn)會向左偏移button的titleLabel的寬度,而標(biāo)題會向右偏移圖片的寬度,既然如此,我們就可以設(shè)置偏移量來達(dá)到我們想要的任何效果
[button setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 0, -button.titleLabel.intrinsicContentSize.width)];
[button setTitleEdgeInsets:UIEdgeInsetsMake(0, -button.currentImage.size.width, 0, 0)];
設(shè)置image偏移量的時候并不是設(shè)置的-button.titleLabel.bounds.size.width,而是-button.titleLabel.intrinsicContentSize.width,因為在iOS8之后-button.titleLabel.bounds.size.width的值為0,經(jīng)多方搜索才找到一個替代的方法,這樣設(shè)置的意義就是將image的偏移量距右邊的距離減少了titleLabel的寬度,由于默認(rèn)是向左便宜了這么多,我們這樣設(shè)置之后相當(dāng)于抵消了左移的偏移量,所以圖片就居中了,對于title道理是一樣的。這一點明白之后剩下的就沒什么難題了,繼續(xù),title下移,image上移:
[button setImageEdgeInsets:UIEdgeInsetsMake(-button.titleLabel.intrinsicContentSize.height, 0, 0, -button.titleLabel.intrinsicContentSize.width)]; [button setTitleEdgeInsets:UIEdgeInsetsMake(button.currentImage.size.height, -button.currentImage.size.width, 0, 0)];
圖片和標(biāo)題好像有點近,好辦,再加一點:
[button setTitleEdgeInsets:UIEdgeInsetsMake(button.currentImage.size.height + 20, -button.currentImage.size.width, 0, 0)];
代碼:
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 160, 160)];
[button setImage:[UIImage imageNamed:@"ffw_32"] forState:UIControlStateNormal];
[button setTitle:@"按鈕" forState:UIControlStateNormal];
button.titleLabel.font = [UIFont systemFontOfSize:14];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
button.center = self.view.center;
button.backgroundColor = [UIColor grayColor];
[self.view addSubview:button];
NSLog(@"%f",-button.titleLabel.bounds.size.width);
[button setImageEdgeInsets:UIEdgeInsetsMake(-button.titleLabel.intrinsicContentSize.height, 0, 0, -button.titleLabel.intrinsicContentSize.width)];
[button setTitleEdgeInsets:UIEdgeInsetsMake(button.currentImage.size.height + 20, -button.currentImage.size.width, 0, 0)];
例子:在代碼中使用UIProgressView 設(shè)置了Progress Image和Track Image沒能正常的工作
Progress Image:
Track Image:
效果圖:
解決方法:
新建個子類繼承UIProgressView,并添加兩個屬性分別是:
@property (nonatomic,strong)UIImage *ggTrackImage;
@property (nonatomic,strong)UIImage *ggProgressImage;
分別在set方法里對UIProgressView
自帶的trackImage
,和ProgressImge
進(jìn)行賦值,因為iOS的bug就不能直接拿到屬性進(jìn)行賦值了,取出UIProgressView
的SubViews
,并根據(jù)自己的需求對圖片進(jìn)行拉伸,我這里選擇的是平滑拉伸,代碼如下:
-(void)setGgTrackImage:(UIImage *)ggTrackImage
{
_ggTrackImage=ggTrackImage;
UIImageView *trackImageView=self.subviews.firstObject;
CGRect trackProgressFrame=trackImageView.frame;
trackProgressFrame.size.height=self.frame.size.height;
trackImageView.frame=trackProgressFrame;
CGFloat width = _ggTrackImage.size.width/2.0;
CGFloat height = _ggTrackImage.size.height/2.0;
UIImage *imgTrack = [_ggTrackImage resizableImageWithCapInsets:UIEdgeInsetsMake(height, width, height, width)];
trackImageView.image=imgTrack;
}
-(void)setGgProgressImage:(UIImage *)ggProgressImage
{
_ggProgressImage=ggProgressImage;
CGFloat width = _ggProgressImage.size.width/2.0;
CGFloat height = _ggProgressImage.size.height/2.0;
UIImageView *progressImageView=self.subviews.lastObject;
CGRect ProgressFrame=progressImageView.frame;
ProgressFrame.size.height=self.frame.size.height;
progressImageView.frame=ProgressFrame;
UIImage *imgProgress = [_ggProgressImage resizableImageWithCapInsets:UIEdgeInsetsMake(height, width, height, width)];progressImageView.image=imgProgress;
}
搞定,將這個類導(dǎo)入其他使用直接進(jìn)行圖片賦值即可
參考博客:
http://www.lxweimin.com/p/3907e6116f41
http://www.lxweimin.com/p/af2d471f7b9c
http://www.lxweimin.com/p/a577023677c1
http://www.lxweimin.com/p/4e4801cbda2b
http://www.lxweimin.com/p/901f9b98f7c2
http://www.lxweimin.com/p/0d3dbc30fad5