CALayer 實用屬性補(bǔ)充

為方便對CALayer的學(xué)習(xí),特記錄以下內(nèi)容,整理自ios核心動畫高級技巧 · GitBook?(墻裂推薦閱讀此翻譯文檔)

?contents 屬性

這個屬性的類型被定義為id(這是由于MacOSX歷史原因造成的,因為在Mac中這個屬性對CGImage和NSImage都起作用),意味著它可以時任何對象類型,但實際上,如果給contents賦值不是CGImageRef,得到的都將是空白圖片??墒荂GImageRef屬于Core Foundation類型,所以,賦值的時候,需要進(jìn)行橋接轉(zhuǎn)換。

示例1:

?-(void\)viewDidLoad {

[super viewDidLoad];

UIImage *image = [UIImage imageNamed:@"demoImage"];

?self.demoView.layer.contents = (__bridge id )(image.CGImage);

?}

contentsGravity

這個屬性是NSString類型,它和UIView的contentMode一樣,目的是為了處理內(nèi)容在圖層的邊界內(nèi)如何對齊??蛇x的常量值有以下這些:

kCAGravityCenter

kCAGravityCenter

?kCAGravityTop

kCAGravityTop

?kCAGravityBottom

kCAGravityBottom

?kCAGravityLeft

kCAGravityLeft

?kCAGravityRight

kCAGravityRight

?kCAGravityTopLeft

kCAGravityTopLeft

?kCAGravityTopRight

kCAGravityTopRight

?kCAGravityBottomLeft

kCAGravityBottomLeft

?kCAGravityBottomRight

kCAGravityBottomRight

?kCAGravityResize(默認(rèn)值)

kCAGravityResize

?kCAGravityResizeAspect

kCAGravityResizeAspect

?kCAGravityResizeAspectFill

kCAGravityResizeAspectFill

?contentsScale

這個屬性是浮點(diǎn)類型,默認(rèn)值為1.0,它定義了像素尺寸和視圖大小的比例(類似于分辨率,UIView相似功能的屬性是contentScaleFactor)。如果設(shè)置了contentsGravity屬性為kCAGravityResizeAspect(拉伸)時,將會忽略contentsScale,因為拉伸圖片適應(yīng)圖層時,根本不會考慮分辨率問題。當(dāng)我們使用UIImage時,會獲取高質(zhì)量的圖片,但CGImage沒有拉伸概念,因此使用CGImage設(shè)置圖片時,拉伸的因素會在轉(zhuǎn)換的時候丟失,當(dāng)用代碼設(shè)置contents圖片時,要手動設(shè)置圖層的contentsScale的屬性,避免Retina屏幕顯示錯誤

layer.contentsScale = [UIScreen mainScreen].scale;

contentsScale

maskToBounds

默認(rèn)情況下,UIView會繪制超過邊界的內(nèi)容或子視圖,CALayer也一樣。UIView有一個叫做clipsToBounds屬性可以用來決定是否顯示超出邊界的內(nèi)容,CALaer對應(yīng)的屬性是maskToBounds,設(shè)置為YES,會剪去超出邊界的部分(不顯示)。

?contentsRect

這個屬性是CGRect類型,它允許我們設(shè)置圖層顯示內(nèi)容圖片的一個區(qū)域。與bounds和frame不同,contentsRect不是使用點(diǎn)來計算的,它使用了單位坐標(biāo),值在0~1之間。默認(rèn)值是{0,0,1,1},意為整個圖片大小。

圖片選自網(wǎng)絡(luò)

contentsRect在App中常常用來將拼合的圖片裁剪開來,分解成各個部分顯示出來。

?示例2:

?@interface ViewController()

?@property (strong, nonatomic) IBOutletCollection(UIView) NSArray *spriteImages;

?@end

?@implementation ViewController

?-(void)viewDidLoad {

[super viewDidLoad];

UIImage *image = [UIImage imageNamed:@"compsiteImage"];

NSUInteger count = self.spriteImages.count;

for(int i = 0; i < count; i++) {

?UIView *view = self.spriteImages[i];

?CGRect rect = CGRectMake(i * 1.0/ count , 0, 1.0/count, 1);

[self addImage:image toView:view withContentsRect:rect];

?}

?}

?-(void)addImage:(UIImage *)image toView:(UIView *)toView withContentsRect:(CGRect)rect{

toView.layer.contents = (__bridge id)image.CGImage;

?toView.layer.contentsRect = rect;

?}

?@end

demo

?contentsCenter

這個屬性類型是CGRect,它用來確定圖層上可拉伸區(qū)域,使用單位坐標(biāo),默認(rèn)值是{0,0,1,1}. 它與UIImage的-resizableImageWithCapInsets:方法相似。

contentsCenter

這個屬性是可以在Interface Builder 里面進(jìn)行配置的。

Stretching
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容