ios - 将现有的和事件的手势识别器传递给模态视图 Controller

标签 ios uigesturerecognizer

我想通过长按启动模态视图,然后在取消长按时关闭模态视图。我该怎么做?

  • 我尝试将 longPressRecognizer 传递给模态视图,然后 将其设置为委托(delegate),但这没有用。
  • 我尝试了一些更简单的方法 - 检测 touchesEnded,这意味着在模态视图中触摸结束,但也不会触发。

有没有办法告诉模态视图手势已经开始?我想让你认识到这个手势或触摸的结束/取消?


ViewController.swift

import UIKit

class ViewController: UIViewController, UIGestureRecognizerDelegate {
    var buttonView:UIView!
    var longPressRecognizer:UILongPressGestureRecognizer!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "longPressed:")
        self.longPressRecognizer.delegate = self
        self.view.addGestureRecognizer(self.longPressRecognizer)

        // Add a button
        buttonView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 100))
        buttonView.userInteractionEnabled = true;
        buttonView.backgroundColor = UIColor.grayColor()
        self.view.addSubview(buttonView)
    }

    func longPressed(recognizer: UILongPressGestureRecognizer) {
        let point: CGPoint = recognizer.locationInView(self.view)
        if let pressedView = self.view.hitTest(point, withEvent: nil) {
            if pressedView == self.buttonView {
                switch recognizer.state {
                case .Began:
                    NSLog("long pressed - Began")
                    var mediaViewController = MediaViewController()
                    self.presentViewController(mediaViewController, animated: false, completion: nil)
                case .Cancelled:
                    NSLog("long pressed - Cancelled")
                case .Ended:
                    NSLog("long pressed - Ended")
                default:
                    break
                }
            }
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

MediaViewController.swift

import UIKit

class MediaViewController: UIViewController, UIGestureRecognizerDelegate {
    var longPressRecognizer:UILongPressGestureRecognizer!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.lightGrayColor()

        self.longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "longPressed:")
        self.longPressRecognizer.delegate = self
        self.view.addGestureRecognizer(self.longPressRecognizer)
    }

    func longPressed(recognizer: UILongPressGestureRecognizer) {
        switch recognizer.state {
        case .Began:
            NSLog("long pressed - Began")
        case .Cancelled:
            NSLog("long pressed - Cancelled")
        case .Ended:
            NSLog("long pressed - Ended")
            self.dismissViewControllerAnimated(false, completion: nil)
        default:
            break
        }
    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        NSLog("touches began")
    }

    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        NSLog("touches ended")
    }

}

最佳答案

嗯,这似乎可以在长按的同时处理轻击手势。不错!


ViewController.swift

import UIKit

class ViewController: UIViewController, UIGestureRecognizerDelegate {
    var buttonView:UIView!
    var longPressRecognizer:UILongPressGestureRecognizer?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        // Add a button
        buttonView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 100))
        buttonView.userInteractionEnabled = true;
        buttonView.backgroundColor = UIColor.grayColor()
        self.view.addSubview(buttonView)
    }

    override func viewDidAppear(animated: Bool) {
        if let recognizer  = self.longPressRecognizer {
            // Reuse existing recognizer
            self.longPressRecognizer = recognizer
            recognizer.removeTarget(nil, action: nil)
            recognizer.addTarget(self, action: "longPressed:")
            recognizer.delegate = self
            self.view.addGestureRecognizer(recognizer)
        } else {
            // Create a new new recognizer
            self.longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "longPressed:")
            self.longPressRecognizer!.delegate = self
            self.view.addGestureRecognizer(self.longPressRecognizer!)
        }
    }

    override func viewDidDisappear(animated: Bool) {
        // Remove the recognizer
        if let recognizer = self.longPressRecognizer {
            self.view.removeGestureRecognizer(recognizer)
        }
    }

    func longPressed(recognizer: UILongPressGestureRecognizer) {
        let point: CGPoint = recognizer.locationInView(self.view)
        if let pressedView = self.view.hitTest(point, withEvent: nil) {
            if pressedView == self.buttonView {
                switch recognizer.state {
                case .Began:
                    NSLog("ViewController: long pressed - Began")
                    var mediaViewController = MediaViewController()
                    mediaViewController.addRecognizer(recognizer)
                    self.presentViewController(mediaViewController, animated: false, completion: nil)
                case .Cancelled:
                    NSLog("ViewController: long pressed - Cancelled")
                case .Ended:
                    NSLog("ViewController: long pressed - Ended")
                case .Changed:
                    NSLog("ViewController: long pressed - Changed")
                default:
                    break
                }
            }
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

MediaViewController.swift

class MediaViewController: UIViewController, UIGestureRecognizerDelegate {
    var longPressRecognizer: UILongPressGestureRecognizer!
    var tapRecognizer: UITapGestureRecognizer!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.lightGrayColor()

        self.tapRecognizer = UITapGestureRecognizer(target: self, action: "tap:")
        self.tapRecognizer.cancelsTouchesInView = false
        self.tapRecognizer.delegate = self
        self.view.addGestureRecognizer(self.tapRecognizer)

        self.longPressRecognizer.removeTarget(nil, action: nil)
        self.longPressRecognizer.addTarget(self, action: "longPressed:")
        self.longPressRecognizer.delegate = self
        self.view.addGestureRecognizer(self.longPressRecognizer)
    }

    override func viewWillDisappear(animated: Bool) {
        // Remove gesture recognizers
        self.view.removeGestureRecognizer(self.longPressRecognizer)
        self.longPressRecognizer.delegate = nil
        self.view.removeGestureRecognizer(self.tapRecognizer)
        self.tapRecognizer.delegate = nil
    }

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true;
    }

    func longPressed(recognizer: UILongPressGestureRecognizer) {
        switch recognizer.state {
        case .Began:
            NSLog("MediaViewController: long pressed - Began")
        case .Cancelled:
            NSLog("MediaViewController: long pressed - Cancelled")
        case .Ended:
            NSLog("MediaViewController: long pressed - Ended")
            self.dismissViewControllerAnimated(false, completion: nil)
        case .Changed:
            NSLog("MediaViewController: long pressed - Changed")
        default:
            break
        }
    }

    func tap(recongizer: UITapGestureRecognizer) {
        if (self.view.backgroundColor == UIColor.lightGrayColor()) {
            self.view.backgroundColor = UIColor.greenColor()
        } else {
            self.view.backgroundColor = UIColor.lightGrayColor()
        }
    }

    func addRecognizer(recognizer: UILongPressGestureRecognizer) {
        self.longPressRecognizer = recognizer
    }

}

关于ios - 将现有的和事件的手势识别器传递给模态视图 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29545536/

相关文章:

ios - UIScreenEdgePanGestureRecognizer 边缘属性未按预期设置

ios - Xcode - TableView - 多个部分

ios - 写入错误的目标地址格式时,MFMailViewComposer 不会返回错误

ios - Swift:获取 UIPanGestureRecognizer 的目标

ios - LongPressGestureRecognizer 从 View 背后识别

swift - UITableView 点击手势行为

ios - MKMapView 区域 DidChange 在缩放/缩小时从未被调用

ios - 在独立 View 上应用自动布局

iphone - didSelectRowAtIndexPath 不工作

ios - 当 userinteractionenabled 为 NO 时获取触摸