gestures
play

Gestures Mobile Application Development in iOS School of EECS - PowerPoint PPT Presentation

Gestures Mobile Application Development in iOS School of EECS Washington State University Instructor: Larry Holder Mobile Application Development in iOS 1 Outline Gestures Gesture recognizers Gesture states Custom gestures


  1. Gestures Mobile Application Development in iOS School of EECS Washington State University Instructor: Larry Holder Mobile Application Development in iOS 1

  2. Outline • Gestures • Gesture recognizers • Gesture states • Custom gestures Mobile Application Development in iOS 2

  3. Add Gesture in Storyboard • Step 1: Drag gesture into view Mobile Application Development in iOS 3

  4. Add Gesture in Storyboard • Step 2: Connect gesture to @IBAction // In ViewController class... @IBAction func tapDetected (_ sender: UIGestureRecognizer) { let point = sender.location(in: self.view) let x = Int(point.x) let y = Int(point.y) print("tap detected at (\(x),\(y))") } Mobile Application Development in iOS 4

  5. Add Gesture Programmatically • View controller class conforms to UIGestureRecognizerDelegate • Implement method to handle gesture • Create gesture recognizer and add to view Mobile Application Development in iOS 5

  6. Add Gesture Programmatically class ViewController: UIViewController, UIGestureRecognizerDelegate { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view let twoTouchTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTwoTouchTap)) twoTouchTapGestureRecognizer.delegate = self twoTouchTapGestureRecognizer.numberOfTouchesRequired = 2 self.view.addGestureRecognizer(twoTouchTapGestureRecognizer) } @objc func handleTwoTouchTap (_ sender: UITapGestureRecognizer) { let point = sender.location(in: self.view) let x = Int(point.x) let y = Int(point.y) print("two-touch tap detected at (\(x),\(y))") } } Mobile Application Development in iOS 6

  7. Other Gestures: Subclasses of UIGestureRecognizer UITapGestureRecognizer (multiple taps/touches) • UIPinchGestureRecognizer • UIRotationGestureRecognizer • Note: Only one UISwipeGestureRecognizer • gesture detected UIPanGestureRecognizer • per user interaction. UIScreenEdgeGestureRecognizer • UILongPressGestureRecognizer • class MyGesture: UIGestureRecognizer (custom) • Mobile Application Development in iOS 7

  8. Gesture States • UIGestureRecognizer.State – .possible (default) – .began (calls action) – .changed (calls action) – .ended (calls action, reset to .possible) – .cancelled (calls action, reset to .possible) – .failed (no call to action, reset to .possible) – .recognized (multi-touch, calls action, reset to .possible) developer.apple.com/documentation/uikit/uigesturerecognizer/state • Mobile Application Development in iOS 8

  9. Gesture States (e.g., Pan) let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) panGestureRecognizer.delegate = self self.view.addGestureRecognizer(panGestureRecognizer) @objc func handlePan (_ sender: UIPanGestureRecognizer) { let point = sender.location(in: self.view) let x = Int(point.x) let y = Int(point.y) if (sender.state == .began) { print("pan began at (\(x),\(y))") } if (sender.state == .changed) { print ("pan moved to (\(x),\(y))") } if (sender.state == .ended) { print ("pan ended at (\(x),\(y))") } } Mobile Application Development in iOS 9

  10. Custom Gestures Create subclass of UIGestureRecognizer • Import UIKit.UIGestureRecognizerSubclass • – Defines methods and properties to override Override main gesture functions • – touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) – touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) – touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) – touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) – reset() Mobile Application Development in iOS 10

  11. Custom Gesture Example: Backslash Mobile Application Development in iOS 11

  12. Backslash Custom Gesture (1) import UIKit import UIKit.UIGestureRecognizerSubclass class BackslashGestureRecognizer: UIGestureRecognizer { var initialPoint: CGPoint! var previousPoint: CGPoint! override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) { print("backslash: touchesBegan") let touch = touches.first if let point = touch?.location(in: self.view) { initialPoint = point previousPoint = point state = .began } } Mobile Application Development in iOS 12

  13. Backslash Custom Gesture (2) override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) { print("backslash: touchesMoved") let touch = touches.first if let point = touch?.location(in: self.view) { if ((point.x previousPoint.x) && (point.y previousPoint.y)) { previousPoint = point state = .changed } else { state = .failed } } } Mobile Application Development in iOS 13

  14. Backslash Custom Gesture (3) override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) { print("backslash: touchesEnded") let touch = touches.first if let point = touch?.location(in: self.view) { if (point != initialPoint) { state = .ended } else { state = .failed } } } Mobile Application Development in iOS 14

  15. Backslash Custom Gesture (4) override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) { print("backslash: touchesCancelled") state = .cancelled } override func reset() { print("backslash: reset") } } Mobile Application Development in iOS 15

  16. Backslash Custom Gesture (5) // In viewDidLoad... let backslashGestureRecognizer = BackslashGestureRecognizer(target: self, action: #selector(handleBackslash)) backslashGestureRecognizer.delegate = self self.view.addGestureRecognizer(backslashGestureRecognizer) // In ViewController... @objc func handleBackslash(_ sender: BackslashGestureRecognizer) { if sender.state == .ended { print("backslash detected") } } Remember to conform ViewController to UIGestureRecognizerDelegate Mobile Application Development in iOS 16

  17. Drawing Boxes var boxViews: [UIView] = [] func drawBox(_ point: CGPoint) { let boxRect = CGRect(x: point.x, y: point.y, width: 5.0, height: 5.0) let boxView = UIView(frame: boxRect) boxView.backgroundColor = UIColor.red self.view?.addSubview(boxView) boxViews.append(boxView) } func clearBoxes() { for boxView in boxViews { boxView.removeFromSuperview() } boxViews.removeAll() } Mobile Application Development in iOS 17

  18. Multiple Gestures • Simultaneous gestures – func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool • Gesture preference – func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool Mobile Application Development in iOS 18

  19. Multiple Gestures func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool { if gestureRecognizer is BackslashGestureRecognizer { if otherGestureRecognizer is UITapGestureRecognizer { return true } } return false } func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { if gestureRecognizer is BackslashGestureRecognizer { if otherGestureRecognizer is UITapGestureRecognizer { return true } } return false } Mobile Application Development in iOS 19

  20. Multiple Gestures • Preserving interactions with view elements – E.g., button taps will go to gesture, not UIButton – Use gestureRecognizer: shouldReceive // In ViewController func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { if touch.view is UIButton { return false } // Add more checks for other types of view elements, as needed return true } Mobile Application Development in iOS 20

  21. Resources • Human Interface Guidelines: Gestures – developer.apple.com/design/human-interface- guidelines/ios/user-interaction/gestures • UIGestureRecognizer API Reference – developer.apple.com/documentation/uikit/uigesturerecognizer • Implementing a custom gesture recognizer – developer.apple.com/documentation/uikit/touches_presses_an d_gestures/implementing_a_custom_gesture_recognizer Mobile Application Development in iOS 21

Recommend


More recommend