開頭
為什麼我要寫就contentsCenter
這個屬性做一個記錄呢?!因為我在學習這個屬性的時候,理解了好久,到現在,有點頭緒,記錄下來,希望有幫助。
緣由
偶然看到gitbook
上有iOS Core Animation: Advanced Techniques中文譯本,所以準備好好學習學習,這裡也推薦給有需要的朋友,我自己只看到了contents
屬性那塊,也正是看裡面有關於contentsCenter
屬性的內容看得一頭霧水,所以才想要寫這篇文章。
先來看看文件裡是怎麼介紹contentsCenter
這個屬性的吧!
原文
contentsCenter
本章我們介紹的最後一個和內容有關的屬性是contentsCenter
,看名字你可能會以為它可能跟圖片的位置有關,不過這名字著實誤導了你。contentsCenter
其實是一個CGRect
,它定義了一個固定的邊框和一個在圖層上可拉伸的區域。 改變contentsCenter
的值並不會影響到寄宿圖的顯示,除非這個圖層的大小改變了,你才看得到效果。
預設情況下,contentsCenter
是{0, 0, 1, 1}
,這意味著如果大小(由conttensGravity
決定)改變了,那麼寄宿圖將會均勻地拉伸開。但是如果我們增加原點的值並減小尺寸。我們會在圖片的周圍創造一個邊框。圖2.9展示了contentsCenter
設定為{0.25, 0.25, 0.5, 0.5}
的效果。
圖2.9 contentsCenter
的例子
這意味著我們可以隨意重設尺寸,邊框仍然會是連續的。他工作起來的效果和UIImage
裡的-resizableImageWithCapInsets:
方法效果非常類似,只是它可以運用到任何寄宿圖,甚至包括在Core Graphics
執行時繪製的圖形。
contentsCenter
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UIView *button1;
@property (nonatomic, weak) IBOutlet UIView *button2;
@end
@implementation ViewController
- (void)addStretchableImage:(UIImage *)image withContentCenter:(CGRect)rect toLayer:(CALayer *)layer
{
//set image
layer.contents = (__bridge id)image.CGImage;
//set contentsCenter
layer.contentsCenter = rect;
}
- (void)viewDidLoad
{
[super viewDidLoad]; //load button image
UIImage *image = [UIImage imageNamed:@"Button.png"];
//set button 1
[self addStretchableImage:image withContentCenter:CGRectMake(0.25, 0.25, 0.5, 0.5) toLayer:self.button1.layer];
//set button 2
[self addStretchableImage:image withContentCenter:CGRectMake(0.25, 0.25, 0.5, 0.5) toLayer:self.button2.layer];
}
@end
複製程式碼
困惑
效果真的讓人很看不懂,我一度以為那個陰影就是它的效果。
效果補充
首先,說明下下文中用到的圖片尺寸為200*200,最上層圖層,黃色:藍色:黃色 = 1:2 :1,這個比例很重要。
接下來看看在相同尺寸下,不同的contentsCenter
作用在這張圖片中,會變現什麼樣的效果。
contentsCenter
不同。為什麼會這樣呢?因為圖片的尺寸剛好就是200*200,而且下圖的contentsCenter
為(0.25, 0.25, 0.5, 0.5),而0.25就是黃色色塊的寬度在整個圖片中的寬度佔比,所以看起來兩張圖沒有區別。
接下來的三組圖,將展示圖二在尺寸分別為100*100,250*250,300*300的情況,與圖一的區別。
我認為在三組對比圖中,最為直觀的一個點就是,黃色色塊的大小一直沒變。變的只有綠色,藍色及紅色色塊。
讓我們來回頭看看這張圖。
我特意用紅線將整個圖片的分佈標明,意在表現出一種阻斷的效果。意思是,只有四個角是被完全限制住的,不能延展。而因為圖片的特殊性,圖中的紅線恰好能見例子中用到的圖片中的色塊完整單獨的分離開。這樣,我們應該不難理解,為什麼黃色色塊的大小在上面的例子中是固定的。這就類似與利用九切片機型切圖。結束語
到這裡,我們可能大概瞭解contentsCenter
這個屬性的效果了,至於怎麼用,那就看實際應用場景了。通過這個屬性,我們也可以看到,CALayer
中還是有許多好用的屬性等待我們去發掘的。大家如果有用得好用的屬性和方法,希望可以寫在留言區,共同交流學習。
鑑於本人的知識有限,文章必有紕漏,望大家可以見諒,不吝指出。