? 今天朋友面試問到了關于UIView和CALayer的區(qū)別之處,回來問到我,把我也問懵了.于是我?guī)е活w好奇的心,對這個知識點就行了詳細的研究. 廢話不多說,開始我們的解釋
1.UIView和CAlayer的區(qū)別
UIView和CALayer的區(qū)別.UIView相對于CAlayer來說就多了一個事件處理功能,CALayer是不能處理用戶的觸摸事件的,顯示出來的東西需要和用戶交互的時候,是需要使用UIView的,如果不需要跟用戶進行交互的時候就可以使用UIView或者是CAlayer;

說完差別我們來說一下隱式動畫,當我們在改變CALayer的屬性的時候,會產生動畫,但是往往我都沒有去思考這個動畫是怎么產生的,而修改UIView的屬性的時候反而沒有動畫,看到這個差別就引起了我們的思考......思考人生,哈哈!
話不多說步入正題:
2. 我先從源頭開始說起:隱式動畫的產生
每一個UIView都關聯(lián)著一個CALayer,我們可以成這個CALayer是根層,所有的非根層,也就是自己手動創(chuàng)建的CALayer對象,都有隱式動畫
3.再來講解一下原因:什么是隱式動畫
在修改CALayer(非根層)的屬性的時候,會自動的產生一些動畫,但是在修改UIView的屬性的時候并不能產生動畫
4.后來說一下什么時候回出現(xiàn)隱式動畫:CALayer的隱式動畫主要變現(xiàn)在幾個方面
bonus:在修改CALayer的寬度和高度的時候,會產生動畫效果
backgroundColor:修改背景顏色的時候,會產生背景色漸變的效果
position:修改這個屬性,會產生平移動畫
例子說明:
- (void)viewDidLoad {
? ? [super viewDidLoad];
? ? CGSize size = [UIScreen mainScreen].bounds.size;
? ? CALayer * layer = [[CALayer alloc]init];
? ? layer.bounds=CGRectMake(0,0,KIDWH,KIDWH);
? ? layer.backgroundColor = [UIColor colorWithRed:0 green:146/255.0 blue:1.0/255.0 alpha:1.0].CGColor;
? ? [self.view.layer addSublayer:layer];
? ? layer.borderWidth=2;
? ? //設置顏色,QuartCore是跨平臺的,所以無法使用UIColor
? ? layer.borderColor = [UIColor orangeColor].CGColor;
? ? layer.position=CGPointMake(size.width/2, size.height/3);
? ? layer.cornerRadius=KIDWH/2;
? ? layer.masksToBounds=YES;
? ? //設置陰影
? ? layer.shadowColor = [UIColor grayColor].CGColor;
? ? layer.shadowOffset = CGSizeMake(10, 10);
? ? layer.shadowOpacity=0.9;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent*)event{
? ? UITouch* touch = [touchesanyObject];
? ? CALayer * layer = self.view.layer.sublayers[0];
? ? CGFloat width = layer.bounds.size.width;
? ? if(width ==KIDWH) {
? ? ? ? width =4*KIDWH;
? ? }
? ? else{
? ? ? ? width =KIDWH;
? ? }
? ? layer.bounds=CGRectMake(0,0, width, width);
? ? //設置layer的當前位置是點擊的點的位置(點擊在self.view上的點)
? ? layer.position = [touch locationInView:self.view];
? ? layer.cornerRadius= width /2;
}
5.隱式動畫的展示時間是0.25秒,非??斓?
說到這里也需大家會問,隱式動畫我不想要的時候,怎么禁用,哈哈,想到這里表示你思考問題還是很全面的,下面我就來揭曉這個答案:
?關閉隱式動畫 使用的是動畫的事務方法實現(xiàn)的
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent*)event{
? ? UITouch* touch = [touchesanyObject];
? ? //關閉隱式動畫? 開啟事務
? ? [CATransaction begin];
? ? //禁用隱式動畫
? ? [CATransaction setDisableActions:YES];
? ? CALayer * layer = self.view.layer.sublayers[0];
? ? CGFloat width = layer.bounds.size.width;
? ? if(width ==KIDWH) {
? ? ? ? width =4*KIDWH;
? ? }
? ? else{
? ? ? ?width =KIDWH;
? ?}
? ? layer.bounds=CGRectMake(0,0, width, width);
? ? //設置layer的當前位置是點擊的點的位置(點擊在self.view上的點)
? ? layer.position = [touch locationInView:self.view];
? ? layer.cornerRadius= width /2;
? ? //提交事務
? ? [CATransaction commit];
}
