本文共 7251 字,大约阅读时间需要 24 分钟。
CAshapeLayer是一个layer可以直接加到视图的sublayer中去,这样就不需要重写drawrect方法了。一般前两个都是和CAShapeLayer结合使用.
***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/