仿網易郵箱大師手勢解鎖(Swift版)

每次打開網易郵箱大師進來第一個界面就是解鎖削彬,這種設計很好的保護用戶的隱私宴抚。手勢解鎖也是一種很好的密碼方式,今天小編就介紹一下這個手勢解鎖奠蹬。
先看下效果,我在網易郵箱大師的bandle里沒有找到解鎖相關的圖片嗡午,感覺有可能是自己畫的囤躁,這里我的圖片是東湊西湊的,大家湊合看吧荔睹。

效果

思路

創(chuàng)建按鈕

  func initButtons() {
        
        let btnW: CGFloat = 80
        let rowCount: CGFloat = 3
        let gap = (self.frame.width - btnW * rowCount) / (rowCount + 1)
        for i in 0 ..< 9 {
            let list = CGFloat(i % 3 ) // 列
            let row = CGFloat( i / 3 ) // 行
            let button = UIButton()
            button.frame = CGRectMake((btnW + gap) * list + gap, (btnW + gap) * row + 20 + topLabel.frame.maxY , btnW, btnW)
            button.tag = i
            button.setBackgroundImage(UIImage(named: "handle_normal"), forState: .Normal)
            button.setBackgroundImage(UIImage(named: "handle_selected"), forState: .Selected)
            button.userInteractionEnabled = false
            self.addSubview(button)
        }
        
    }

設置起點和按鈕選中狀態(tài)

  override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        guard result else {
            return
        }
        
        let point = pointWithTouch(touches)
        if let btn = buttonWithPoint(point) {
            if !btn.selected {
                btn.selected = true
                buttons.append(btn)
            }
        }
    }

移動中添加軌跡上的按鈕到數組狸演,并且不能重復添加,最后調用self.setNeedsDisplay()繪制軌跡

   override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        guard result else {
            return
        }
        let point = pointWithTouch(touches)
        movePoint = point
        if let btn = buttonWithPoint(point) {
            if !btn.selected {
                btn.selected = true
                if !buttons.contains(btn) {
                    buttons.append(btn)
                }
            }
        }
        self.setNeedsDisplay()
    }

結束后記錄按鈕的順序僻他,并保存到本地宵距,最后清空數組重新繪制一下

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        guard result else {
            return
        }
        var str = ""
        for button in buttons {
            button.selected = false
            str += String(button.tag)
        }
        
        if handleResult(str) {
            result = true
            buttons.removeAll()
            self.setNeedsDisplay()
            handleBlock?(result: true)
        }else {
            for button in buttons {
                button.setBackgroundImage(UIImage(named: "handle_warning"), forState: .Normal)
            }
            result = false
            self.setNeedsDisplay()
            addAnimation()
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
                Int64(2.0 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
                    self.result = true
                    for button in self.buttons {
                        button.setBackgroundImage(UIImage(named: "handle_normal"), forState: .Normal)
                    }
                    self.buttons.removeAll()
                    self.setNeedsDisplay()
            }
            handleBlock?(result: false)
        }
    }

drawRect方法主要是繪制軌跡和設置按鈕狀態(tài)

    // 繪制軌跡
    override func drawRect(rect: CGRect) {
        if self.buttons.count == 0 {
            return
        }
        let path = UIBezierPath()
        for i in 0 ..< self.buttons.count {
            let button = buttons[i]
            if i == 0 {
                path.moveToPoint(button.center)
            }else {
                path.addLineToPoint(button.center)
            }
        }
        path.addLineToPoint(movePoint)
        path.lineWidth = 8
        if result {
            UIColor.greenColor().set()
        }else {
            UIColor.redColor().set()
        }
        path.lineJoinStyle = .Round
        path.stroke()
    }

以上是主要代碼,歡迎大家指出錯誤
在這里下載代碼中姜,歡迎大家Star消玄。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丢胚,隨后出現的幾起案子翩瓜,更是在濱河造成了極大的恐慌,老刑警劉巖携龟,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兔跌,死亡現場離奇詭異,居然都是意外死亡峡蟋,警方通過查閱死者的電腦和手機坟桅,發(fā)現死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕊蝗,“玉大人仅乓,你說我怎么就攤上這事∨钇荩” “怎么了夸楣?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我豫喧,道長石洗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任紧显,我火速辦了婚禮讲衫,結果婚禮上,老公的妹妹穿的比我還像新娘孵班。我一直安慰自己涉兽,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布篙程。 她就那樣靜靜地躺著花椭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪房午。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天丹允,我揣著相機與錄音郭厌,去河邊找鬼。 笑死雕蔽,一個胖子當著我的面吹牛折柠,可吹牛的內容都是我干的。 我是一名探鬼主播批狐,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼扇售,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嚣艇?” 一聲冷哼從身側響起承冰,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎食零,沒想到半個月后困乒,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡贰谣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年娜搂,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吱抚。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡百宇,死狀恐怖,靈堂內的尸體忽然破棺而出秘豹,到底是詐尸還是另有隱情携御,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站因痛,受9級特大地震影響婚苹,放射性物質發(fā)生泄漏。R本人自食惡果不足惜鸵膏,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一膊升、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谭企,春花似錦廓译、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盹廷,卻和暖如春征绸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俄占。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工管怠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缸榄。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓渤弛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親甚带。 傳聞我的和親對象是個殘疾皇子她肯,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容