你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS_39_觸摸解鎖

iOS_39_觸摸解鎖

編輯:IOS開發綜合
最終效果圖: \
控制器:<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPgoKPHByZSBjbGFzcz0="brush:java;">// // BeyondViewController.m // 39_觸摸解鎖 // // Created by beyond on 14-9-17. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "BeyondViewController.h" #import "LockView.h" #import "LockViewDelegate.h" // 遵守協議,用於獲知,用戶在LockView上畫的解鎖路徑 @interface BeyondViewController () @end @implementation BeyondViewController #pragma mark - LockView代理方法 // 用於獲知,用戶在LockView上畫的解鎖路徑 - (void)lockView:(LockView *)lockView didFinishPath:(NSString *)path { [MBProgressHUD showSuccess:path]; NSLog(@"獲得用戶的手勢路徑:%@", path); } @end

自定義CircleButton
//
//  Circle.m
//  39_觸摸解鎖
//
//  Created by beyond on 14-9-17.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "Circle.h"

@implementation Circle

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // 自定義方法,初始化
        [self setup];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder]) {
        // 自定義方法,初始化
        [self setup];
    }
    return self;
}

// 自定義方法,初始化
- (void)setup
{
    // 設置按鈕不可用(不可點擊)
    self.userInteractionEnabled = NO;
    
    // 設置默認的背景圖片
    [self setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
    
    // 設置選中時的背景圖片(selected)
    [self setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];
}

@end


LockView定義的協議
//
//  LockViewDelegate.h
//  39_觸摸解鎖
//
//  Created by beyond on 14-9-17.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  自定義的LockView的代理必需 遵守的協議

#import 

@class LockView;

@protocol LockViewDelegate 


@optional
// 鎖屏手勢繪制完成時,調用本方法,通知外界
- (void)lockView:(LockView *)lockView didFinishPath:(NSString *)path;

@end


核心代碼,自定義的LockView
//
//  LockView.h
//  39_觸摸解鎖
//
//  Created by beyond on 14-9-17.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import 
@protocol LockViewDelegate;
@interface LockView : UIView

// 代理,為當前控制器,目的是,解鎖手勢繪制完成後,通知它
@property (nonatomic, weak) IBOutlet id delegate;

@end


//
//  LockView.m
//  39_觸摸解鎖
//
//  Created by beyond on 14-9-17.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  重點,核心~~~

#import "LockView.h"
#import "Circle.h"
#import "LockViewDelegate.h"


@interface LockView()
// 數組,記住所有的touchMove經過的circle
@property (nonatomic, strong) NSMutableArray *circleArr;
// 手指一直與屏幕保持觸摸的點,活動的點,用於繪制最後一個circle的中心到 用戶觸摸點的線段
@property (nonatomic, assign) CGPoint activePoint;
@end


@implementation LockView


#pragma mark - 懶加載
// 數組,記住所有的touchMove經過的circle
- (NSMutableArray *)circleArr
{
    if (_circleArr == nil) {
        _circleArr = [NSMutableArray array];
    }
    return _circleArr;
}
#pragma mark - 初始化
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // 調用自定義方法,一次性添加所有的按鈕
        [self addAllCircles];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder]){
        // 調用自定義方法,一次性添加所有的按鈕
        [self addAllCircles];
    }
    return self;
}
// 調用自定義方法,一次性添加所有的按鈕
- (void)addAllCircles
{
    for (int index = 0; index<9; index++) {
        // 創建自定義按鈕,綁定tag目的是,將來用於驗證鎖的順序
        Circle *btn = [Circle buttonWithType:UIButtonTypeCustom];
        btn.tag = index;
        // 添加按鈕
        [self addSubview:btn];
    }
}
#pragma mark - 父類方法
// 每添加一個circle,就調整一下所有子控件的frame
- (void)layoutSubviews
{
    // 必須先調用父類的方法
    [super layoutSubviews];
    // 遍歷所有的子按鈕,重新調整frame
    for (int i = 0; i

storyboard

  1. 上一頁:
  2. 下一頁:
Copyright © Ios教程網 All Rights Reserved