(1)在calayer内部绘图需要遵循这个layer的代理方法:myLayer.delegare = self;//这个mylayer是在父视图中创建的,你要直接在父视图里面给mylayer上面显示东西,就需要前面的代理方法了。
那么前面的为什么不需要呢,因为他是在创建这个layer,而不是去他的内部干什么.所以不需要。
//self.view.layer.delegate = self.view;不能这样,或者myLayer.delegare = self.view;因为每个view当中都有一个自己的layer来显示界面,第一个的话是给这个父视图的layer复写
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
}这个方法,做的图是直接在父视图上面显示的,而后面的那个则是不对的,新建的layer的代理=父视图的view是不对的,而如果在父视图中想要复写这个方法的话是需要调用 [self.view.layer setneeddisplay],这个是界面刷新。
如果在创建了一个子类view,则在[self.view addsubview:]的时候调用了一次[self.view.layersetneeddisplay].
//UIKit提供的方法在此协议中无效,为了避免CoreAniamtion跨平台的框架和UIKit相应的方法耦合在一起
// [[UIColor blueColor] setFill];
// UIRectFill(CGRectMake(50, 50, 100, 100));
//CGAPI
CGContextAddRect(ctx, CGRectMake(50, 50, 100, 100));
CGContextSetRGBStrokeColor(ctx, 0, 0, 1, 1);
CGContextDrawPath(ctx, kCGPathStroke);
这句话的意思是在复写drawlayer的时候不能用uikit的方法引文Uikit只能在ios中使用,而core animation则是一个c接口,都能用,你不能有一个小得那个类的方法,去给大得那个类定义,定义成功了,这个大的类也无法给其他小类使用了。
还有你每次新建一个view的时候,他自己默认了一个协议self.view.delegate = self.view;
如果你想子类化drawrect就是调用- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
NSLog(@"%p", ctx);
[super drawLayer:layer inContext:ctx];//这个方法是下面这个方法的复写,写了这个下面这个就不调用了
}
- (void)drawRect:(CGRect)rect {
// NSLog(@"%@", self);
// NSLog(@"%@", self.layer.delegate);
CGContextRef context = UIGraphicsGetCurrentContext();
NSLog(@"%p", context);//这个方法是父类的方法,如果没有方法重写,则调用此方法进行画图。
}
非rootLayer的某一些属性默认带隐式动画效果,时长为1/4s,下面的方法都是自己新建的layer自带的动画效果
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint p = [touch locationInView:self.view];
myLayer.position = p;
NSInteger size = arc4random_uniform(50) + 50;
myLayer.bounds = CGRectMake(0, 0, size, size);
myLayer.backgroundColor = [UIColor greenColor].CGColor;
myLayer.cornerRadius = arc4random_uniform(20);//这个显示界面得角度
myLayer.opacity = arc4random_uniform(10)/10.0;//这个显示界面得透明度
//其他的可以通过commed点进去查看
}