W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
????當(dāng)圖層屬性的混合體被指定為在未預(yù)合成之前不能直接在屏幕中繪制時,屏幕外渲染就被喚起了。屏幕外渲染并不意味著軟件繪制,但是它意味著圖層必須在被顯示之前在一個屏幕外上下文中被渲染(不論CPU還是GPU)。圖層的以下屬性將會觸發(fā)屏幕外繪制:
maskToBounds
一起使用時)????屏幕外渲染和我們啟用光柵化時相似,除了它并沒有像光柵化圖層那么消耗大,子圖層并沒有被影響到,而且結(jié)果也沒有被緩存,所以不會有長期的內(nèi)存占用。但是,如果太多圖層在屏幕外渲染依然會影響到性能。
????有時候我們可以把那些需要屏幕外繪制的圖層開啟光柵化以作為一個優(yōu)化方式,前提是這些圖層并不會被頻繁地重繪。
????對于那些需要動畫而且要在屏幕外渲染的圖層來說,你可以用CAShapeLayer
,contentsCenter
或者shadowPath
來獲得同樣的表現(xiàn)而且較少地影響到性能。
????cornerRadius
和maskToBounds
獨立作用的時候都不會有太大的性能問題,但是當(dāng)他倆結(jié)合在一起,就觸發(fā)了屏幕外渲染。有時候你想顯示圓角并沿著圖層裁切子圖層的時候,你可能會發(fā)現(xiàn)你并不需要沿著圓角裁切,這個情況下用CAShapeLayer
就可以避免這個問題了。
????你想要的只是圓角且沿著矩形邊界裁切,同時還不希望引起性能問題。其實你可以用現(xiàn)成的UIBezierPath
的構(gòu)造器+bezierPathWithRoundedRect:cornerRadius:
(見清單15.1).這樣做并不會比直接用cornerRadius
更快,但是它避免了性能問題。
清單15.1 用CAShapeLayer
畫一個圓角矩形
#import "ViewController.h"
#import
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UIView *layerView;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//create shape layer
CAShapeLayer *blueLayer = [CAShapeLayer layer];
blueLayer.frame = CGRectMake(50, 50, 100, 100);
blueLayer.fillColor = [UIColor blueColor].CGColor;
blueLayer.path = [UIBezierPath bezierPathWithRoundedRect:
CGRectMake(0, 0, 100, 100) cornerRadius:20].CGPath;
?
//add it to our view
[self.layerView.layer addSublayer:blueLayer];
}
@end
????另一個創(chuàng)建圓角矩形的方法就是用一個圓形內(nèi)容圖片并結(jié)合第二章『寄宿圖』提到的contensCenter
屬性去創(chuàng)建一個可伸縮圖片(見清單15.2).理論上來說,這個應(yīng)該比用CAShapeLayer
要快,因為一個可拉伸圖片只需要18個三角形(一個圖片是由一個3*3網(wǎng)格渲染而成),然而,許多都需要渲染成一個順滑的曲線。在實際應(yīng)用上,二者并沒有太大的區(qū)別。
清單15.2 用可伸縮圖片繪制圓角矩形
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//create layer
CALayer *blueLayer = [CALayer layer];
blueLayer.frame = CGRectMake(50, 50, 100, 100);
blueLayer.contentsCenter = CGRectMake(0.5, 0.5, 0.0, 0.0);
blueLayer.contentsScale = [UIScreen mainScreen].scale;
blueLayer.contents = (__bridge id)[UIImage imageNamed:@"Circle.png"].CGImage;
//add it to our view
[self.layerView.layer addSublayer:blueLayer];
}
@end
????使用可伸縮圖片的優(yōu)勢在于它可以繪制成任意邊框效果而不需要額外的性能消耗。舉個例子,可伸縮圖片甚至還可以顯示出矩形陰影的效果。
????在第2章我們有提到shadowPath
屬性。如果圖層是一個簡單幾何圖形如矩形或者圓角矩形(假設(shè)不包含任何透明部分或者子圖層),創(chuàng)建出一個對應(yīng)形狀的陰影路徑就比較容易,而且Core Animation繪制這個陰影也相當(dāng)簡單,避免了屏幕外的圖層部分的預(yù)排版需求。這對性能來說很有幫助。
????如果你的圖層是一個更復(fù)雜的圖形,生成正確的陰影路徑可能就比較難了,這樣子的話你可以考慮用繪圖軟件預(yù)先生成一個陰影背景圖。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: