手勢解鎖

#import "LockView.h"

@interface LockView ()
@property(nonatomic,assign)CGPoint curtentP;
@property(nonatomic,retain)NSMutableArray * selectedsBtn;
@end
@implementation LockView
-(NSMutableArray*)selectedsBtn
{
    if (!_selectedsBtn)
    {
        _selectedsBtn=[NSMutableArray array];
    }
    return _selectedsBtn;
}
-(instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        [self setUp];
      //必需設(shè)置背景顏色,否則會繪畫出亂
        self.backgroundColor=[UIColor clearColor];
    }
    return self;
}
-(void)setUp
{
    //創(chuàng)建9個按鈕
    for (int i=0; i<9; i++)
    {
        UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
        //不允許用戶交互,按鈕就不能點擊,也就不能達(dá)到高亮狀態(tài)
        btn.userInteractionEnabled=NO;
        btn.tag = i;
        [btn setImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
        [btn setImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];
        [self addSubview:btn];
        
    }
    UIPanGestureRecognizer *pan=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)];
    [self addGestureRecognizer:pan];
}
//只要調(diào)用這個方法,就會把之前繪制的東西全部清掉,重新繪制
- (void)drawRect:(CGRect)rect
{
    //沒有選中按鈕,不需要連線
    if (self.selectedsBtn.count ==0) return;
    //把所有選中按鈕中心點連線
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    NSUInteger count = self.selectedsBtn.count;
    //把所有選中按鈕之間都連好線
    for (int i = 0; i<count; i++)
    {
        UIButton *btn = self.selectedsBtn[i];
        if (i == 0)
        {
            //設(shè)置起點
            [path moveToPoint:btn.center];
        }
        else
        {
            [path addLineToPoint:btn.center];
        }
    }
    //連線到手指的觸摸點
    if (self.selectedsBtn.count>0)
    {
        [path addLineToPoint:_curtentP];
    }
    
    [[UIColor greenColor] set];
    path.lineWidth = 10;
    path.lineJoinStyle = kCGLineJoinRound;
    [path stroke];
    
}
-(void)pan:(UIPanGestureRecognizer*)pan
{
    //獲取觸摸點
    _curtentP = [pan locationInView:self];
    //判斷觸摸點在不在按鈕上
    for (UIButton*btn in self.subviews)
    {
        //點在不在某個范圍內(nèi),并且按鈕沒有被選中
        //CGRectContainsPoint(btn.frame, _curtentP) 判斷這個點是不是在這個范圍同一個坐標(biāo)系
        if (CGRectContainsPoint(btn.frame, _curtentP) && btn.selected==NO)
        {
            //點在按鈕上
            btn.selected = YES;
            //保存到數(shù)組中
            [self.selectedsBtn addObject:btn];
        }
    }
    
    if (pan.state == UIGestureRecognizerStateEnded)
    {
        //創(chuàng)建可變字符串
        NSMutableString *strM = [NSMutableString string];
        //保存輸入密碼
        for (UIButton*btn in self.selectedsBtn)
        {
            [strM appendFormat:@"%ld",btn.tag];
            btn.selected=NO;
            
        }
        NSLog(@"%@",strM);
        
        //還原界面
        //清除畫線,把選中按鈕清空
        [self.selectedsBtn removeAllObjects];
        
    }
   
    //重繪
    [self setNeedsDisplay];
    
}
//為什么要在這個方法布局子控件,因為只要一調(diào)用這個方法,就表示父控件的尺寸確定
-(void)layoutSubviews
{
    [super layoutSubviews];
    
    NSUInteger count = self.subviews.count;
    int cols = 3;
    CGFloat x = 0;
    CGFloat y = 0;
    CGFloat w = 74;
    CGFloat h = 74;
    
    CGFloat margin = (self.bounds.size.width - cols*w)/(cols+1);
    
    CGFloat col = 0;
    CGFloat row = 0;
    for (NSUInteger i=0; i<count; i++)
    {
        UIButton*btn = self.subviews[i];
        //獲取當(dāng)前按鈕的列數(shù)
        col = i%cols;
        row = i/cols;
        x = margin + col * (margin + w);
        y = row * (margin + w);
        btn.frame = CGRectMake(x, y, w, h);
    }
    
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容