博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 中关于绘图的框架介绍、手势解锁
阅读量:4290 次
发布时间:2019-05-27

本文共 7251 字,大约阅读时间需要 24 分钟。

  • iOS提供了两套绘图框架,分别是UIBezierPathCore Graphics。UIBezierPath是UIKit的一个类。UIBezierPath是对Core Graphics框架的进一步封装。另外还有CAShapeLayer是Quartz core中的一个类。

    CAshapeLayer是一个layer可以直接加到视图的sublayer中去,这样就不需要重写drawrect方法了。一般前两个都是和CAShapeLayer结合使用.

  • OpenGL和Core Graphics都是绘图专用的API类族,调用图形处理器(GPU)进行图形的绘制和渲染。在架构上是平级的,相比UIkit更接近底层。
  • CAShapeLayer: CAShapeLayer顾名思义,继承于CALayer。 每个CAShapeLayer对象都代表着将要被渲染到屏幕上的一个任意的形状(shape)。具体的形状由其path(类型为CGPathRef)属性指定。 普通的CALayer是矩形,所以需要frame属性。CAShapeLayer初始化时也需要指定frame值,但 它本身没有形状,它的形状来源于其属性path 。CAShapeLayer有不同于CALayer的属性,它从CALayer继承而来的属性在绘制时是不起作用的。
  • 1、CoreGraphics是基于Quartz框架的绘图引擎,同Quartz 2D是等价的。
  • 2、Quartz Extreme是针对Quartz底层的GPU加速。
  • 3、Quartz仅使用OpenGL的命令集,直接连接AGP(图形加速接口)
  • 4、Quartz在CPU上执行绘图命令,在GPU上最终合成成图形
  • 5、QuartzGL是Quartz 2D API的GPU加速。启用QuartzGL后,所有Quartz绘图命令都将转换为OpenGL命令并在GPU上执行。这个模式默认是关闭的
  • 6、Quartz在进行3D图形渲染时是基于OpenGL的,通过OpenGL连接AGP

***CAShapeLayer的使用:一般UIBezierPath、Coregraphic和CAShapeLayer配合使用,就不需要重写drawrect方法了;

- (void)viewDidLoad {    [super viewDidLoad];         //创建出CAShapeLayer    self.shapeLayer = [CAShapeLayer layer];    self.shapeLayer.frame = CGRectMake(0, 0, 200, 200);//设置shapeLayer的尺寸和位置    self.shapeLayer.position = self.view.center;    self.shapeLayer.fillColor = [UIColor clearColor].CGColor;//填充颜色为ClearColor         //设置线条的宽度和颜色    self.shapeLayer.lineWidth = 1.0f;    self.shapeLayer.strokeColor = [UIColor redColor].CGColor;         //创建出圆形贝塞尔曲线    UIBezierPath *circlePath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 200, 200)];         //让贝塞尔曲线与CAShapeLayer产生联系    self.shapeLayer.path = circlePath.CGPath;         //添加并显示    [self.view.layer addSublayer:self.shapeLayer];}

***手势解锁:

#import 
@interface ViewController : UIViewController@end==================#import "ViewController.h"#import "UnLockView.h"@interface ViewController ()
@property (weak,nonatomic) IBOutletUnLockView *unLockView;@property (weak,nonatomic) IBOutletUIImageView *imageView;@end@implementation ViewController- (void)viewDidLoad {    [superviewDidLoad];    // Do any additional setup after loading the view, typically from a nib.        //设置背景图片    self.view.backgroundColor = [UIColorcolorWithPatternImage:[UIImageimageNamed:@"Home_refresh_bg"]];    //设置代理    self.unLockView.delegate =self;}//实现代理方法- (void)UnLockView:(UnLockView *)unLockView withPwd:(NSString *)pwdStr{    //1.开启图形上下文    UIGraphicsBeginImageContextWithOptions(self.unLockView.frame.size,NO, 0.0);        //2.获取上下文对象    CGContextRef ctx =UIGraphicsGetCurrentContext();        //3.调用view.layer的方法renderInContext把view上的内容绘制到图形上下文中    [self.unLockView.layerrenderInContext:ctx];        //4.从图形上下文中获取图片    UIImage * getImage =UIGraphicsGetImageFromCurrentImageContext();        //5.结束图形上下文对象    UIGraphicsEndImageContext();        //6.保存图片(显示)//    UIImageWriteToSavedPhotosAlbum(getImage, nil, nil, nil);    self.imageView.image = getImage;    NSLog(@"%@",pwdStr);}- (void)didReceiveMemoryWarning {    [superdidReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}@end===============#import
@class UnLockView;@protocol  UnLockViewDelegate
- (void) UnLockView:(UnLockView *) unLockView withPwd:(NSString *) pwdStr;@end@interface UnLockView : UIView@property (nonatomic,weak) id
delegate;@end=================#import "UnLockView.h"@interface UnLockView()@property (nonatomic,strong) NSMutableArray *selectedBtns;@property(nonatomic,assign)CGPoint currentPoint;@end@implementation UnLockView//懒加载- (NSMutableArray *)selectedBtns{    if (_selectedBtns ==nil)    {        _selectedBtns = [NSMutableArrayarray];    }    return_selectedBtns;}//创建9个按钮- (void)awakeFromNib{    //通过for循环    for (int i =0; i < 9; i++)    {        //创建按钮        UIButton * button = [UIButtonbuttonWithType:UIButtonTypeCustom];                //设置背景图        [button setBackgroundImage:[UIImageimageNamed:@"gesture_node_normal"]forState:UIControlStateNormal];        //设置选中时的图片        [button setBackgroundImage:[UIImageimageNamed:@"gesture_node_highlighted"]forState:UIControlStateSelected];                //添加按钮        [selfaddSubview:button];                //禁止和用户交互        button.userInteractionEnabled =NO;                //设置tag        button.tag = i;    }}//设置按钮frame- (void)layoutSubviews{    [superlayoutSubviews];        //按钮的宽高    CGFloat w =74;    CGFloat h =74;        //父View的size    CGSize superSize =self.frame.size;    //列数和行数相同都是 3        int totleRow =3;    //    1.子view的横向间距 = (父view的宽度- 3 * 子view的宽度) / 4    CGFloat marginX = (superSize.width - totleRow * w) / (totleRow +1);        //    2.子view的纵向间距 = (父view的高度- 3 * 子view的高度) / 4    CGFloat marginY = (superSize.height - totleRow * h) / (totleRow +1);        for (int i =0; i < self.subviews.count; i ++)    {                //    3.当前子view的行号 =当前遍历到得索引值 /总列数        int row = i / totleRow;                //    4.当前子view的列号 =当前遍历到得索引值 %总列数        int colum = i % totleRow;                //    5.子view横坐标的公式 =子view的横向间距 +列号 * (子view的横向间距+子view的宽度)        CGFloat x = marginX +  colum * (marginX + w);                //    6.子view纵坐标的公式 =子view的纵向间距 +行号 * (子view的纵向间距+子view的高度)                CGFloat y = marginY + row * (marginY + h);        UIButton * button =self.subviews[i];                //设置frame        button.frame =CGRectMake(x, y, w, h);    }}//手指按下- (void)touchesBegan:(NSSet
*)touches withEvent:(UIEvent *)event{    //1.获取触摸对象    UITouch * touch = touches.anyObject;        //2.获取触摸点        CGPoint locP = [touchlocationInView:touch.view];        //判断点是否在按钮内    for (int i =0; i < self.subviews.count; i++)    {        //获取按钮        UIButton * button =self.subviews[i];                if (CGRectContainsPoint(button.frame, locP) && !button.selected)        {            button.selected =YES;                        //把选中按钮添加到数组中            [self.selectedBtnsaddObject:button];            break;        }    }  }//手指移动- (void)touchesMoved:(NSSet
*)touches withEvent:(UIEvent *)event{    //1.获取触摸对象    UITouch * touch = touches.anyObject;       //2.获取触摸点    self.currentPoint = [touchlocationInView:touch.view];    [selftouchesBegan:touches withEvent:event];        //执行重绘    [selfsetNeedsDisplay];}//手指抬起- (void)touchesEnded:(NSSet
*)touches withEvent:(UIEvent *)event{        //设置self.currentPoint为最后一个按钮的中心点    self.currentPoint = [self.selectedBtns.lastObjectcenter];        //获取密码    NSMutableString * pwdString = [NSMutableStringstring];        for (UIButton * buttonin self.selectedBtns)    {        [pwdString appendFormat:@"%@",@(button.tag)];    }        //执行重绘        [selfsetNeedsDisplay];//    NSLog(@"%@",pwdString);    //调用代理    if ([self.delegaterespondsToSelector:@selector(UnLockView:withPwd:)])    {        [self.delegateUnLockView:selfwithPwd:pwdString];    }        //修改按钮的选中状态== NO//    for (UIButton * button in self.selectedBtns)//    {//        button.selected = NO;//    }        //清除    [self.selectedBtnsremoveAllObjects];        //执行重绘    [selfsetNeedsDisplay];}- (void)drawRect:(CGRect)rect {    // Drawing code        //判断数组为空就返回    if(self.selectedBtns.count == 0) return;        //1.创建路径    UIBezierPath * path = [UIBezierPathbezierPath];        //设置线宽颜色    path.lineWidth =5;        //设置线头样式和连接处样式    path.lineCapStyle =kCGLineCapRound;        path.lineJoinStyle =kCGLineJoinRound;        [[UIColorwhiteColor] set];        //添加子路径        for (int i =0; i < self.selectedBtns.count; i++)    {        //获取按钮        UIButton * button =self.selectedBtns[i];                //获取按钮的中心点        CGPoint point = button.center;                //判断设置起始点        if(i ==0)        {            [path moveToPoint:point];        }        else        {            [path addLineToPoint:point];        }    }    [path addLineToPoint:self.currentPoint];    //2.渲染    [path stroke];}@end
 

转载地址:http://bhlgi.baihongyu.com/

你可能感兴趣的文章
WebView的JavaScript与本地代码三种交互方式
查看>>
WebView的JavaScript与本地代码三种交互方式
查看>>
Android Studio里面配置Tesseract
查看>>
深入浅出JavaScript之this
查看>>
Android include标签的使用注意事项
查看>>
final成员变量和final局部变量
查看>>
Android数据加密之异或加密算法
查看>>
greenDao好的示例网址
查看>>
SDK无埋点技术在百分点的探索和实践
查看>>
Android自定义控件--仿安全卫士中的一键加速
查看>>
微信小程序快速入门
查看>>
Android EditText被软键盘遮盖处理
查看>>
JavaScript 中变量、作用域和内存问题的学习
查看>>
Android Tools Attributes,让布局设计所见即所得
查看>>
FlipDotView——磁翻点阵显示效果
查看>>
浅析回话技术之Session和Cookie
查看>>
20道经典Java面试基础题
查看>>
Android弹窗PopupWindow
查看>>
JavaScript的原型系统是怎样构建起来的
查看>>
控制反转(IoC)-解析与实现
查看>>