ios手勢密碼Swift4.0

ios手勢密碼Swift4.0

之前做的P2P項目用到了手勢密碼的功能,由于著急上線,所以在網(wǎng)上扒了一個,但是為了滿足自己的代碼需求,改了改別人的代碼,過程是十分痛苦的.現(xiàn)在的新項目同樣要用到手勢密碼的功能,所以我干脆就自己重新寫了一個宪萄,由于我用的是Swift艺谆,所以這個手勢密碼也是用Swift4.0寫的。
手勢密碼的實現(xiàn)其實還是很簡單的拜英,我的做法就是用貝塞爾曲線來展現(xiàn)出用戶的滑動軌跡,用button來記錄下用戶設(shè)置的手勢密碼的具體值
用戶設(shè)置手勢密碼的類中(實質(zhì)就是一個UIView)中
創(chuàng)建九宮格排列的Button,用來顯示和記錄用戶設(shè)置的手勢密碼的具體值,并給自己添加一個手勢

extension HLGestureUnlockView {
    ///添加手勢,創(chuàng)建按鈕
    func setup()  {
        //創(chuàng)建一個手勢,添加給自己
        let pan = UIPanGestureRecognizer.init(target: self, action: #selector(panAction(pan:)))
        self.addGestureRecognizer(pan)
        //創(chuàng)建9個按鈕
        for i in 0...8 {
            let btn = UIButton.init(type: .custom)
            btn.isUserInteractionEnabled = false
            btn.setImage(UIImage.init(named: "gesture_node_normal.png"), for: .normal)
            btn.setImage(UIImage.init(named: "gesture_node_pressed.png"), for: .selected)
            btn.tag = 1000 + i + 1
            self.addSubview(btn)
        }
    }
}

下面是layout中按鈕的布局

//MARK: - btn的布局
extension HLGestureUnlockView {
    ///btn的布局
    func setBtnFrame() {
        let count = self.subviews.count
        ///總列數(shù)
        let cols = 3
        var x: CGFloat = 0
        var y: CGFloat = 0
        let w: CGFloat = 58
        let h: CGFloat = 58
        ///間距
        let margin = (self.bounds.size.width - CGFloat(cols) * w) / (CGFloat(cols) + 1)
        //開始布局
        var col: CGFloat = 0
        var row : CGFloat = 0
        for i in 0..<count {
            col = CGFloat(i % cols)
            row = CGFloat(i / cols)
            x = margin + (w + margin) * col
            y = margin + (w + margin) * row
            let btn = self.subviews[i] as! UIButton
            btn.frame = CGRect(x: x, y: y, width: w, height: h)
        }
    }
}

在手勢的方法中,我們需要記錄下當(dāng)前的點,如果當(dāng)前的點較好在某一按鈕的frame中,那么就是用戶設(shè)置了這一個按鈕,我們需要將該按鈕變?yōu)檫x中的狀態(tài)

//MARK: - 實現(xiàn)手勢方法
extension HLGestureUnlockView {
    @objc func panAction(pan: UIPanGestureRecognizer) {
        //給當(dāng)前點復(fù)制
        self.currentPoint = pan.location(in: self)
        self.setNeedsDisplay()
        for btn in self.subviews {
            let btn = btn as! UIButton
            if (btn.frame.contains(self.currentPoint) && btn.isSelected == false) {
                btn.isSelected = true
                self.selectedBtns.append(btn)
            }
        }
        self.layoutIfNeeded()
        //手勢結(jié)束的時候
        var gesturePwd = ""
        if pan.state == .ended {
            for btn in self.selectedBtns {
                gesturePwd += "\(btn.tag - 1000)"
                btn.isSelected = false
            }
            self.selectedBtns.removeAll()
            //手勢密碼繪制完成后的回調(diào)
            if self.delegate != nil {
                self.delegate?.gestureDidFinished(gesturePassword: gesturePwd)
            }
        }
    }
}
最后就是在draw方法中實現(xiàn)畫線的功能就好了
```swift
//MARK: - 重寫drawRect
extension HLGestureUnlockView {
    override func draw(_ rect: CGRect) {
        //如果沒有選中按鈕的時候,直接返回
        if self.selectedBtns.count == 0 {
            return
        }
        //將所有的選中按鈕中心點連線
        let path = UIBezierPath()
        let count = self.selectedBtns.count
        for i in 0..<count {
            let btn = self.selectedBtns[i]
            if i == 0 {
                //設(shè)置起點
                path.move(to: btn.center)
            } else {
                //設(shè)置終點
                path.addLine(to: btn.center)
            }
        }
        path.addLine(to: self.currentPoint)
        UIColor.init(red: 15 / 255.0, green: 127 / 255.0, blue: 255 / 255.0, alpha: 1).set()
        path.lineJoinStyle = .round
        path.lineWidth = 8
        path.stroke()
    }
}

到這手勢密碼的這個類就基本寫好了,在加一個設(shè)置好手勢密碼后的回調(diào)就OK了,其實看這個代碼應(yīng)該還是很清楚了静汤,為了簡化操作,我的demo中創(chuàng)建和驗證手勢密碼的界面是用兩個Controller來展示的,演示的圖片就沒搞了,不過虫给,這個手勢密碼完全可以滿足你項目的需求藤抡,demo地址:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抹估,隨后出現(xiàn)的幾起案子缠黍,更是在濱河造成了極大的恐慌,老刑警劉巖药蜻,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓷式,死亡現(xiàn)場離奇詭異,居然都是意外死亡语泽,警方通過查閱死者的電腦和手機贸典,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踱卵,“玉大人廊驼,你說我怎么就攤上這事⊥锷埃” “怎么了妒挎?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長西饵。 經(jīng)常有香客問我饥漫,道長,這世上最難降的妖魔是什么罗标? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮积蜻,結(jié)果婚禮上闯割,老公的妹妹穿的比我還像新娘。我一直安慰自己竿拆,他們只是感情好宙拉,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丙笋,像睡著了一般谢澈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上御板,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天锥忿,我揣著相機與錄音,去河邊找鬼怠肋。 笑死敬鬓,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钉答,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼础芍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了数尿?” 一聲冷哼從身側(cè)響起仑性,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎右蹦,沒想到半個月后诊杆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡嫩实,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年刽辙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甲献。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡宰缤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晃洒,到底是詐尸還是另有隱情慨灭,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布球及,位于F島的核電站氧骤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吃引。R本人自食惡果不足惜筹陵,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镊尺。 院中可真熱鬧朦佩,春花似錦、人聲如沸庐氮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弄砍。三九已至仙畦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間音婶,已是汗流浹背慨畸。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衣式,地道東北人先口。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓型奥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碉京。 傳聞我的和親對象是個殘疾皇子厢汹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件谐宙、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評論 4 62
  • 晚上給大家分享《如何向宇宙下訂單》 開始并沒人理會我跟我互動 當(dāng)時感覺很尷尬 有種講不下去的感覺 然后我就停下來給...
    汐時閱讀 129評論 0 0
  • 1999年 故事發(fā)生在天津的一個郊區(qū)凡蜻。那年我9歲搭综,父母是農(nóng)民,村子上的貧富差距很小划栓。 那時候小伙伴們都會存錢兑巾,買四...
    很走心閱讀 650評論 2 5
  • 我一篇文案發(fā)到我個人公眾號,只有幾千瀏覽量忠荞,可以直接成交幾十萬元蒋歌,但是同樣的文章,發(fā)到人群也很精準(zhǔn)的自媒體賬號委煤,轉(zhuǎn)...
    王通專欄閱讀 618評論 0 1