IOS CALayer的屬性和使用

一、CALayer的常用屬性

  • 1、@propertyCGPoint position;?
    圖層中心點的位置,類似與UIView的center;用來設置CALayer在父層中的位置;以父層的左上角為原點(0,0);

  • 2、 @property CGPoint anchorPoint;?
    稱『定位點』、『錨點』,該描述是相對于x、y位置比例而言的默認在圖像中心點(0.5、0.5)的位置;決定著CALayer身上的哪個點會再position屬性所指的位置,以自己的左上角為原點(0,0);它的x、y取值范圍都是0~1。

  • 3、 @property(nullable) CGColorRef backgroundColor;?
    圖層背景顏色

  • 4、 @property(nullable) CGColorRef borderColor;?
    圖層邊框顏色

  • 5、 @property CGFloat borderWidth;?
    圖層邊框寬度

  • 6、 @property CGRect bounds;?
    圖層大小

  • 7、 @property(nullable, strong) id contents;?
    圖層顯示內容,例如可以將圖片作為圖層內容顯示

  • 8、 @property CGRect contentsRect;?
    圖層顯示內容的大小和位置

  • 9、 @property CGFloat cornerRadius;?
    圓角半徑

  • 10、 @property(getter=isDoubleSided) BOOL doubleSided;?
    圖層背景是否顯示,默認是YES

  • 11、 @property CGRect frame;?
    圖層大小和位置,不支持隱式動畫,所以CALyaer中很少使用frame,通常使用bound和position代替

  • 12、 @property(getter=isHidden) BOOL hidden;?
    是否隱藏

  • 13、 @property(nullable, strong) CALayer *mask;?
    圖層蒙版

  • 14、 @property BOOL masksToBounds;?
    子圖層是否剪切圖層邊界,默認是NO

  • 15、 @property float opacity;?
    圖層透明度,類似與UIView的alpha

  • 16、 @property(nullable) CGColorRef shadowColor;?
    陰影顏色

  • 17、 @property CGSize shadowOffset;?
    陰影偏移量

  • 18、 @property float shadowOpacity;?
    陰影透明度,注意默認為0,如果設置陰影必須設置此屬性

  • 19、 @property(nullable) CGPathRef shadowPath;?
    陰影形狀

  • 20、 @property CGFloat shadowRadius;?
    陰影模糊半徑

  • 21、 @property(nullable, copy) NSArray

二、CALayer不常用屬性

  • 1、 @property CGFloat zPosition;?
    圖層中心點在z軸中的位置

  • 2、 @property CGFloat anchorPointZ;?
    圖層在z軸中的錨點;

  • 3、 - (CGAffineTransform)affineTransform;

  • 4、- (void)setAffineTransform:(CGAffineTransform)m;?
    以上屬性為圖層形變;該屬性值指定一個CGAffineTransform對象,該對象代表對CALayer執行X、Y兩個維度(也就是平面)上的旋轉、縮放、位移、斜切、鏡像等變換矩陣

  • 5、 @property(nullable, readonly) CALayer *superlayer;?
    圖層的父圖層

三、CALayer圖層操作

  • 1、 - (void)addSublayer:(CALayer *)layer;?
    添加子圖層

  • 2、 - (void)removeFromSuperlayer;?
    將自己從父圖層中移除

  • 3、 - (void)insertSublayer:(CALayer *)layer atIndex:(unsigned)idx;?
    在自己子圖層數組中的第idx位置添加圖層

  • 4、 - (void)insertSublayer:(CALayer?)layer below:(nullable CALayer?)sibling;?
    將圖層layer添加在子圖層sibling的下面

  • 5、 - (void)insertSublayer:(CALayer?)layer above:(nullable CALayer?)sibling;?
    將圖層layer添加在子圖層sibling的上面

  • 6、 - (void)replaceSublayer:(CALayer?)layer with:(CALayer?)layer2;?
    將圖層layer替換layer2;

四、CALayer動畫操作

  • 1、 - (void)addAnimation:(CAAnimation?)anim forKey:(nullable NSString?)key;?
    圖層添加某一屬性的動畫

  • 2、 - (nullable NSArray< NSString?>?)animationKeys;?
    獲取所有動畫的屬性

  • 3、 - (nullable CAAnimation?)animationForKey:(NSString?)key;?
    獲取某一屬性的動畫

  • 4、 - (void)removeAnimationForKey:(NSString *)key;?
    移除某一屬性動畫

  • 5、 - (void)removeAllAnimations;?
    移除所有動畫

五、隱式動畫

在ios中CALayer的設計主要是為了內容展示和動畫操作,CALayer本身并不包含在UIKit中,它不能響應事件。由于CALayer在設計之初就考慮它的動畫操作功能,CALayer很多屬性在修改時都能形成動畫效果,這種屬性稱為『隱式動畫屬性』。但是對于UIView的根視圖層而言屬性的修改并不形成動畫效果,因為很多情況下根圖層更多的充當容器的作用,如果它的屬性變動形成動畫效果會直接影響子圖層。另外,UIView的根圖層創建工作完全有iOS負責完成,無法重新創建,但是可以往根圖層中添加子圖層或移除子圖層。

    • 1、如何查看CALayer的某個屬性是否支持隱式動畫

      • 可以查看頭文件,看有沒有Animatable,如果有表示支持;?
        這里寫圖片描述
      • 查看官方文檔
      • 這里寫圖片描述?
      • 下面標明都支持隱式動畫
      • 這里寫圖片描述
    • 2、例子

#pragma mark 繪制圖層
-(void)drawMyLayer{CGSize size=[UIScreen mainScreen].bounds.size;//獲得根圖層layer=[[CALayer alloc]init];//設置背景顏色,由于QuartzCore是跨平臺框架,無法直接使用UIColorlayer.backgroundColor=[UIColor colorWithRed:0 green:146/255.0 blue:1.0 alpha:1.0].CGColor;//設置中心點layer.position=CGPointMake(size.width/2, size.height/2);//設置大小layer.bounds=CGRectMake(0, 0, WIDTH,WIDTH);//設置圓角,當圓角半徑等于矩形的一半時看起來就是一個圓形layer.cornerRadius=WIDTH/2;//設置陰影layer.shadowColor=[UIColor grayColor].CGColor;layer.shadowOffset=CGSizeMake(2, 2);layer.shadowOpacity=.9;//設置邊框//    layer.borderColor=[UIColor whiteColor].CGColor;//    layer.borderWidth=1;//設置錨點//    layer.anchorPoint=CGPointZero;
    [self.view.layer addSublayer:layer];
}
#pragma mark 點擊放大
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{UITouch *touch=[touches anyObject];CGFloat width=layer.bounds.size.width;if (width==WIDTH) {width=WIDTH*4;}else{width=WIDTH;}layer.bounds=CGRectMake(0, 0, width, width);layer.position=[touch locationInView:self.view];layer.cornerRadius=width/2;
}

這里寫圖片描述

七、CALayer繪圖

使用Quartz 2D繪圖,是直接調用UIView的drawRect:方法繪制圖形、圖像,這種方式的本質還是再圖層中繪制。drawRect:方法是由UIKit組件進行調用,因此厘米那可以使用到一些UIKir封裝的方法進行繪制,而直接繪制到圖層的方法由于并非UIKit直接調用因此只能用原生的Core Graphics方法繪制;?
圖層繪制有兩種方法,不管使用那種方法繪制完必須調用圖層的setNeedDisplay方法,下面介紹圖層的兩種繪制方法:

(1)、通過圖層代理drawLayer:inContext:方法繪制

通過代理方法進行圖層呢個繪制只要指定圖層的代理,然后在代理對象中重寫 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;方法即可。需要注意這個方法雖然是代理方法但是不用手動實習那CALayerDelegate,因為CALayer定義中給NSObject做了分類擴展,所有的NSObject都包含這個方法。另外設置完代理后必須要調用圖層的 - (void)setNeedsDisplay;方法,否測繪制內容無法顯示;?
例如:

#pragma mark 繪制圖層
-(void)drawMyLayer{//自定義圖層CALayer *layer=[[CALayer alloc]init];layer.bounds=CGRectMake(0, 0, PHOTO_HEIGHT, PHOTO_HEIGHT);layer.position=CGPointMake(160, 200);layer.backgroundColor=[UIColor redColor].CGColor;layer.cornerRadius=PHOTO_HEIGHT/2;//注意僅僅設置圓角,對于圖形而言可以正常顯示,但是對于圖層中繪制的圖片無法正確顯示//如果想要正確顯示則必須設置masksToBounds=YES,剪切子圖層layer.masksToBounds=YES;//陰影效果無法和masksToBounds同時使用,因為masksToBounds的目的就是剪切外邊框,//而陰影效果剛好在外邊框//    layer.shadowColor=[UIColor grayColor].CGColor;//    layer.shadowOffset=CGSizeMake(2, 2);//    layer.shadowOpacity=1;//設置邊框layer.borderColor=[UIColor whiteColor].CGColor;layer.borderWidth=2;//設置圖層代理layer.delegate=self;//添加圖層到根圖層
    [self.view.layer addSublayer:layer];//調用圖層setNeedDisplay,否則代理方法不會被調用
    [layer setNeedsDisplay];
}
#pragma mark 繪制圖形、圖像到圖層,注意參數中的ctx是圖層的圖形上下文,其中繪圖位置也是相對圖層而言的
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{//    NSLog(@"%@",layer);//這個圖層正是上面定義的圖層
    CGContextSaveGState(ctx);//圖形上下文形變,解決圖片倒立的問題CGContextScaleCTM(ctx, 1, -1);CGContextTranslateCTM(ctx, 0, -PHOTO_HEIGHT);UIImage *image=[UIImage imageNamed:@"001.png"];//注意這個位置是相對于圖層而言的不是屏幕CGContextDrawImage(ctx, CGRectMake(0, 0, PHOTO_HEIGHT, PHOTO_HEIGHT), image.CGImage);//    CGContextFillRect(ctx, CGRectMake(0, 0, 100, 100));//    CGContextDrawPath(ctx, kCGPathFillStroke);
    CGContextRestoreGState(ctx);
}

(2)、使用自定義圖層繪圖

在自定義圖層繪圖時只要自己編寫一個類繼承與CALayer然后在 - (void)drawInContext:(CGContextRef)ctx;中繪圖即可。同前面在代理方法繪圖一樣,要顯示圖層中繪制的內容也要調用圖層的 - (void)setNeedsDisplay;方法,否則 - (void)drawInContext:(CGContextRef)ctx;方法將不會調用;?
例如:?

KCALayer.h
#import "KCALayer.h"@implementation KCALayer
-(void)drawInContext:(CGContextRef)ctx{NSLog(@"3-drawInContext:");NSLog(@"CGContext:%@",ctx);//    CGContextRotateCTM(ctx, M_PI_4);CGContextSetRGBFillColor(ctx, 135.0/255.0, 232.0/255.0, 84.0/255.0, 1);CGContextSetRGBStrokeColor(ctx, 135.0/255.0, 232.0/255.0, 84.0/255.0, 1);//    CGContextFillRect(ctx, CGRectMake(0, 0, 100, 100));//    CGContextFillEllipseInRect(ctx, CGRectMake(50, 50, 100, 100));CGContextMoveToPoint(ctx, 94.5, 33.5);//// Star DrawingCGContextAddLineToPoint(ctx,104.02, 47.39);CGContextAddLineToPoint(ctx,120.18, 52.16);CGContextAddLineToPoint(ctx,109.91, 65.51);CGContextAddLineToPoint(ctx,110.37, 82.34);CGContextAddLineToPoint(ctx,94.5, 76.7);CGContextAddLineToPoint(ctx,78.63, 82.34);CGContextAddLineToPoint(ctx,79.09, 65.51);CGContextAddLineToPoint(ctx,68.82, 52.16);CGContextAddLineToPoint(ctx,84.98, 47.39);CGContextClosePath(ctx);CGContextDrawPath(ctx, kCGPathFillStroke);
}
@end
ViewController.m
#pragma mark 繪制圖層
-(void)drawMyLayer{KCALayer *layer=[[KCALayer alloc]init];layer.bounds=CGRectMake(0, 0, 185, 185);layer.position=CGPointMake(160,284);layer.backgroundColor=[UIColor colorWithRed:0 green:146/255.0 blue:1.0 alpha:1.0].CGColor;//顯示圖層
    [layer setNeedsDisplay];[self.view.layer addSublayer:layer];
}

?

這里寫圖片描述

七、CALayer繪圖

使用Quartz 2D繪圖,是直接調用UIView的drawRect:方法繪制圖形、圖像,這種方式的本質還是再圖層中繪制。drawRect:方法是由UIKit組件進行調用,因此厘米那可以使用到一些UIKir封裝的方法進行繪制,而直接繪制到圖層的方法由于并非UIKit直接調用因此只能用原生的Core Graphics方法繪制;?
圖層繪制有兩種方法,不管使用那種方法繪制完必須調用圖層的setNeedDisplay方法,下面介紹圖層的兩種繪制方法:

(1)、通過圖層代理drawLayer:inContext:方法繪制

通過代理方法進行圖層呢個繪制只要指定圖層的代理,然后在代理對象中重寫 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;方法即可。需要注意這個方法雖然是代理方法但是不用手動實習那CALayerDelegate,因為CALayer定義中給NSObject做了分類擴展,所有的NSObject都包含這個方法。另外設置完代理后必須要調用圖層的 - (void)setNeedsDisplay;方法,否測繪制內容無法顯示;?
例如:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389302.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GridView詳解

快速預覽&#xff1a;GridView無代碼分頁排序GridView選中&#xff0c;編輯&#xff0c;取消&#xff0c;刪除GridView正反雙向排序GridView和下拉菜單DropDownList結合GridView和CheckBox結合鼠標移到GridView某一行時改變該行的背景色方法一鼠標移到GridView某一行時改變該行…

訪問模型參數,初始化模型參數,共享模型參數方法

一. 訪問模型參數 對于使用Sequential類構造的神經網絡&#xff0c;我們可以通過方括號[]來訪問網絡的任一層。回憶一下上一節中提到的Sequential類與Block類的繼承關系。 對于Sequential實例中含模型參數的層&#xff0c;我們可以通過Block類的params屬性來訪問該層包含的所有…

QZEZ第一屆“飯吉圓”杯程序設計競賽

終于到了飯吉圓杯的開賽&#xff0c;這是EZ我參與的歷史上第一場ACM賽制的題目然而沒有罰時 不過題目很好&#xff0c;舉辦地也很成功&#xff0c;為法老點贊&#xff01;&#xff01;&#xff01; 這次和翰爺&#xff0c;吳駿達 dalao&#xff0c;陳樂揚dalao組的隊&#xff0…

談談數據分析 caoz_讓我們談談開放數據…

談談數據分析 caozAccording to the International Open Data Charter(1), it defines open data as those digital data that are made available with the technical and legal characteristics necessary so that they can be freely used, reused and redistributed by any…

數據創造價值_展示數據并創造價值

數據創造價值To create the maximum value, urgency, and leverage in a data partnership, you must present the data available for sale or partnership in a clear and comprehensive way. Partnerships are based upon the concept that you are offering value for valu…

Java入門系列-22-IO流

File類的使用 Java程序如何訪問文件&#xff1f;通過 java.io.File 類 使用File類需要先創建文件對象 File filenew File(String pathname);&#xff0c;創建時在構造函數中指定物理文件或目錄&#xff0c;然后通過文件對象的方法操作文件或目錄的屬性。 \ 是特殊字符&#xff…

缺了一部分

學Java好多年&#xff0c;也參與一次完整項目&#xff0c;覺得讓自己寫項目寫不出來&#xff0c;總覺得缺了一部分。 在這方面愚笨&#xff0c;不知道缺在哪里。以前覺得是知識不夠牢固&#xff0c;于是重復去學&#xff0c;發現就那些東西。如果沒有業務來熟悉的話&#xff0c…

卷積神經網絡——各種網絡的簡潔介紹和實現

各種網絡模型&#xff1a;來源《動手學深度學習》 一&#xff0c;卷積神經網絡&#xff08;LeNet&#xff09; LeNet分為卷積層塊和全連接層塊兩個部分。下面我們分別介紹這兩個模塊。 卷積層塊里的基本單位是卷積層后接最大池化層&#xff1a;卷積層用來識別圖像里的空間模…

數據中臺是下一代大數據_全棧數據科學:下一代數據科學家群體

數據中臺是下一代大數據重點 (Top highlight)Data science has been an eye-catching field for many years now to young individuals having formal education with a bachelors, masters or Ph.D. in computer science, statistics, business analytics, engineering manage…

net如何判斷瀏覽器的類別

回復&#xff1a;.net如何判斷瀏覽器的類別?瀏覽器型號&#xff1a;Request.Browser.Type 瀏覽器名稱&#xff1a;Request.Browser.browser 瀏覽器版本&#xff1a;Request.Browser.Version 瀏覽器Cookie&#xff1a;Request.Browser.Cookies 你的操作系統&#xff1a;Request…

AVS 端能力模塊

Mark 轉載于:https://www.cnblogs.com/clxye/p/9939333.html

pwn學習之四

本來以為應該能出一兩道ctf的pwn了&#xff0c;結果又被sctf打擊了一波。 bufoverflow_a 做這題時libc和堆地址都泄露完成了&#xff0c;卡在了unsorted bin attack上&#xff0c;由于delete會清0變量導致無法寫&#xff0c;一直沒構造出unsorted bin attack&#xff0c;后面根…

優化算法的簡潔實現

動量法 思想&#xff1a; 動量法使用了指數加權移動平均的思想。它將過去時間步的梯度做了加權平均&#xff0c;且權重按時間步指數衰減。 代碼&#xff1a; 在Gluon中&#xff0c;只需要在Trainer實例中通過momentum來指定動量超參數即可使用動量法。 d2l.train_gluon_ch7…

北方工業大學gpa計算_北方大學聯盟倉庫的探索性分析

北方工業大學gpa計算This is my firts publication here and i will start simple.這是我的第一篇出版物&#xff0c;這里我將簡單介紹 。 I want to make an exploratory data analysis of UFRN’s warehouse and answer some questions about the data using Python and Pow…

泰坦尼克數據集預測分析_探索性數據分析-泰坦尼克號數據集案例研究(第二部分)

泰坦尼克數據集預測分析Data is simply useless until you don’t know what it’s trying to tell you.除非您不知道數據在試圖告訴您什么&#xff0c;否則數據將毫無用處。 With this quote we’ll continue on our quest to find the hidden secrets of the Titanic. ‘The …

各種數據庫連接的總結

SQL數據庫的連接 return new SqlConnection("server127.0.0.1;databasepart;uidsa;pwd;"); oracle連接字符串 OracleConnection oCnn new OracleConnection("Data SourceORCL_SERVER;USERM70;PASSWORDmmm;");oledb連接數據庫return new OleDbConnection…

關于我

我是誰&#xff1f; Who am I&#xff1f;這是個哲學問題。。 簡單來說&#xff0c;我是Light&#xff0c;一個靠前端吃飯&#xff0c;又不想單單靠前端吃飯的Coder。 用以下幾點稍微給自己打下標簽&#xff1a; 工作了兩三年&#xff0c;對&#xff0c;我是16年畢業的90后一直…

L1和L2正則

https://blog.csdn.net/jinping_shi/article/details/52433975轉載于:https://www.cnblogs.com/zyber/p/9257843.html

基于PyTorch搭建CNN實現視頻動作分類任務代碼詳解

數據及具體講解來源&#xff1a; 基于PyTorch搭建CNN實現視頻動作分類任務 import torch import torch.nn as nn import torchvision.transforms as T import scipy.io from torch.utils.data import DataLoader,Dataset import os from PIL import Image from torch.autograd…

missforest_missforest最佳丟失數據插補算法

missforestMissing data often plagues real-world datasets, and hence there is tremendous value in imputing, or filling in, the missing values. Unfortunately, standard ‘lazy’ imputation methods like simply using the column median or average don’t work wel…