登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 - [函数库] >> 主题: [ios/functions_c.m] SetSelfDraw_andSetDrawObject 设置一个控件开启自绘,及自绘的代理类     [回主站]     [分站链接]
标题
[ios/functions_c.m] SetSelfDraw_andSetDrawObject 设置一个控件开启自绘,及自绘的代理类
clq
浏览(353) + 2021-02-22 13:01:54 发表 编辑

关键字:



//设置一个控件开启自绘,及自绘的代理类 //目前来说要增加一个 CALayer,然后可以在 drawLayer 里重绘
//self-drawn control
CALayer * SetSelfDraw_andSetDrawObject(UIView * view, id _self) //NSObject * _self)
{
//可以用增加一个 CALayer 的方式来重绘 uiview, UITextField 等的背景,而不用新写一个类.
//方法是使用它们的代理重写 drawLayer. 不过据说代理的类必须是 UIViewController 而不能是 UIView,因为 uiview 已经是
//一个代理类了. 比较奇怪的是,目前只知道新建的可以,直接使用原来的就不行
//self.txtUserName.layer.delegate = self; //test //需要加入 CALayerDelegate //不行,效果会很奇怪
//[self.txtUserName setNeedsDisplay];

CGRect frame = view.frame;
frame.origin.x = 0;
frame.origin.y = 0;

// 创建一个layer
CALayer * mylayer = [CALayer layer];
mylayer.contentsScale = [UIScreen mainScreen].scale; //2; //ok 这个对图形的显示效果非常重要,没有的话会很粗糙
// [mylayer setBounds:CGRectMake(0, 0, 200, 200)];
// [mylayer setBackgroundColor:[UIColor redColor].CGColor];
// [mylayer setPosition:CGPointMake(100, 100)];

[mylayer setBounds:frame];//[mylayer setBounds:CGRectMake(0, 0, 200, 200)];
[mylayer setBackgroundColor:[UIColor clearColor].CGColor];
//[mylayer setPosition:CGPointMake(0, 0)];[mylayer setPosition:CGPointMake(100, 100)];
//[mylayer setPosition: view.frame.origin];

//一定要设置在 frame 的中心点.否则画不出来,原因见后面的解释
//[mylayer setPosition:CGPointMake(view.frame.size.width * 0.5, view.frame.size.height * 0.5)]; //默认情况下这样也是对的
[mylayer setPosition:CGPointMake(view.frame.size.width * mylayer.anchorPoint.x,
view.frame.size.height * mylayer.anchorPoint.y)];

//-------- https://blog.csdn.net/volitory/article/details/69084213
//1、position是layer中的anchorPoint在superLayer中的位置坐标。
//2、互不影响原则:单独修改position与anchorPoint中任何一个属性都不影响另一个属性。
//3、frame、position与anchorPoint有以下关系:
//frame.origin.x = position.x - anchorPoint.x * bounds.size.width;
//frame.origin.y = position.y - anchorPoint.y * bounds.size.height;
//anchorPoint的默认值为(0.5,0.5),也就是anchorPoint默认在layer的中心点。默认情况下,使用addSublayer函数添加layer时,如果已知layer的frame值,根据上面的结论,那么position的值便可以用下面的公式计算:
//position.x = frame.origin.x + 0.5 * bounds.size.width;
//position.y = frame.origin.y + 0.5 * bounds.size.height;
//里面的0.5是因为anchorPoint取默认值,更通用的公式应该是下面的:
//position.x = frame.origin.x + anchorPoint.x * bounds.size.width;
//position.y = frame.origin.y + anchorPoint.y * bounds.size.height;
//--------

[view.layer addSublayer:mylayer];
//[self.txtUserName.layer addSublayer:mylayer];

// 这里不能将代理设置成view,因为view已经是根layer的代理,再设置一个图层的代理,会由冲突。
// 通常让控制器来充当代理。如果代理多个图层,最好用一个标志区分开,也可以用tag来区分。
[mylayer setDelegate:_self];
[mylayer setNeedsDisplay];

//mylayer.description; //用这个来区分? //现在的问题是当有多个用到同一代理时,代理如何区分它们

return mylayer;

//代理需实现以下接口,在接口中调用 SelfDarw 系列函数
// - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;
// {
// //绘制图层 绘制一个椭圆
// //这里要用quartzcore方法,因为参数是CGContextRef,这个引用不能被uikit方法使用
// CGContextSetRGBFillColor(ctx, 0, 1, 0, 1);
// //CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 100, 200));
// CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 100, 200));
// CGContextSetRGBFillColor(ctx, 1, 1, 0, 1);
// CGContextDrawPath(ctx, kCGPathFill);
//
// }//

}//

CALayer * CreateCanvas(UIView * view, id _self)
{
return SetSelfDraw_andSetDrawObject(view, _self);

}//


总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1