【发布时间】:2015-04-09 17:50:30
【问题描述】:
我想长按启动模态视图,然后在取消长按时关闭模态视图。我该怎么做?
- 我尝试将 longPressRecognizer 传递给模态视图并 将其设置为委托,但这不起作用。
- 我尝试了一些更简单的方法 - 检测 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可以调用并传递触摸事件信息的方法。您需要在您的viewController实现中处理.Changed识别器状态,您将在模式视图控制器上调用您的方法。 -
是的,这是一个非常基本的版本。有人告诉我这很脆弱,但没有证据支持。