Skip to content

Instantly share code, notes, and snippets.

@minsOne
Last active October 6, 2015 18:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save minsOne/5b21abd4d3d586885705 to your computer and use it in GitHub Desktop.
Save minsOne/5b21abd4d3d586885705 to your computer and use it in GitHub Desktop.
특정 뷰를 일정시간 동안 눌렀을 경우 동작하도록 하는 코드
//
// ViewController.swift
// ViewTest
//
// Created by JungMin Ahn on 2015. 5. 20..
// Copyright (c) 2015년 JungMin Ahn. All rights reserved.
//
import UIKit
typealias ElapsedF = (Void -> Bool)
private let kLongPressTime = 30
class ViewController: UIViewController {
@IBOutlet var redView: UIView!
var pressedTouchTimer: NSTimer?
var elapsedHandler: ElapsedF?
var longPress: UILongPressGestureRecognizer!
override func viewDidLoad() {
super.viewDidLoad()
self.attachLongPressGesture()
}
deinit {
self.stopTimer()
}
}
extension ViewController {
func attachLongPressGesture() {
self.stopTimer()
self.redView.removeGestureRecognizer(longPress)
longPress = UILongPressGestureRecognizer(target: self, action: Selector("handleLongPressGesture:"))
longPress.minimumPressDuration = 0.01
self.redView.addGestureRecognizer(longPress)
}
func handleLongPressGesture(recogizer: UILongPressGestureRecognizer) {
switch recogizer.state {
case .Began:
self.startTimer()
case .Ended, .Cancelled, .Failed:
self.stopTimer()
case .Changed:
guard let lView = recogizer.view else { return }
if !CGRectContainsPoint(lView.frame, recogizer.locationInView(lView.superview)) {
self.attachLongPressGesture()
}
default: break
}
}
}
extension ViewController {
func makeElapsedTime() -> ElapsedF {
var elapsedTime = kLongPressTime
return {
if --elapsedTime < 0 { elapsedTime = 0 }
return elapsedTime == 0 ? true : false
}
}
func startTimer() {
self.elapsedHandler = makeElapsedTime()
self.pressedTouchTimer = NSTimer.scheduledTimerWithTimeInterval(
0.1,
target: self,
selector: Selector("longPressTimerHandler"),
userInfo: nil,
repeats: true)
}
func stopTimer() {
self.pressedTouchTimer?.invalidate()
self.pressedTouchTimer = nil
self.elapsedHandler = nil
}
func longPressTimerHandler() {
guard let isElapsedTime = self.elapsedHandler where isElapsedTime() else { return }
self.attachLongPressGesture()
// You can do everything
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment