UITapGestureRecognizer 干扰 UISlider
UITapGestureRecognizer interferes with UISlider
我遇到了一个手势相关的问题,有点类似于:gesture-problem-uiswipegesturerecognizer-uislider
但是我在 swift 中编码,所以我需要 swift 中的解决方案。
我的项目中发生的事情是这样的:
我有一个 ViewController
,用户在屏幕上点击,将执行 segue。但是我在这个 viewcontroller 上有一个 UISlider
,当用户 'releases' 滑块时,它有时(为什么有时而不总是,让我感到困惑)被识别为屏幕上的点击。
所以我知道我必须防止手势识别器 'sees/recognizes' 触及 UIslider
。
但是我该如何防止呢? (在 swift 2.0 中,使用 Xcode7。但如果你在答案中使用较早的 swift 编码,我也能理解)
我对 swift 中的编码相当陌生。希望有人能帮忙!
这是viewcontroller中的代码:
// The slider
@IBOutlet weak var sliderValue: UISlider!
@IBAction func sliderValueChanged(sender: UISlider) {
// Do stuff
}
// UITapGestureRecognizer
override func viewDidLoad() {
super.viewDidLoad()
let touch = UITapGestureRecognizer(target: self, action: "touched:")
self.view.addGestureRecognizer(touch)
}
// Perform Segue
func touched (_: UIGestureRecognizer) {
//Segue to another viewcontroller
performSegueWithIdentifier("nice", sender: self)
}
(编辑:)我用在 Whosebug 上找到的信息更新了我的代码。我添加了 UIGestureRecognizerDelegate
:
class LampOn: UIViewController, UIGestureRecognizerDelegate {...}
并且我添加了shouldReceiveTouch
:
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
gestureRecognizer.delegate = self
if (touch.view == sliderValue){
print("touching slider")
return false
}
else{
print("touching elsewhere")
return true
}
}
但是控制台永远不会调用“shouldReceiveTouch”函数。那我错过了什么?我是否正确设置了委托?
永远不会调用 "shouldReceiveTouch" 函数,因为您在 "shouldReceiveTouch" 函数中设置了委托。在调用函数之前,需要将委托设置为 self。
您需要做的是在 viewDidLoad() 中设置委托,一切都应该没问题。
override func viewDidLoad() {
super.viewDidLoad()
let touch = UITapGestureRecognizer(target: self, action: "touched:")
self.view.addGestureRecognizer(touch)
touch.delegate = self
}
我遇到了一个手势相关的问题,有点类似于:gesture-problem-uiswipegesturerecognizer-uislider
但是我在 swift 中编码,所以我需要 swift 中的解决方案。
我的项目中发生的事情是这样的:
我有一个 ViewController
,用户在屏幕上点击,将执行 segue。但是我在这个 viewcontroller 上有一个 UISlider
,当用户 'releases' 滑块时,它有时(为什么有时而不总是,让我感到困惑)被识别为屏幕上的点击。
所以我知道我必须防止手势识别器 'sees/recognizes' 触及 UIslider
。
但是我该如何防止呢? (在 swift 2.0 中,使用 Xcode7。但如果你在答案中使用较早的 swift 编码,我也能理解) 我对 swift 中的编码相当陌生。希望有人能帮忙!
这是viewcontroller中的代码:
// The slider
@IBOutlet weak var sliderValue: UISlider!
@IBAction func sliderValueChanged(sender: UISlider) {
// Do stuff
}
// UITapGestureRecognizer
override func viewDidLoad() {
super.viewDidLoad()
let touch = UITapGestureRecognizer(target: self, action: "touched:")
self.view.addGestureRecognizer(touch)
}
// Perform Segue
func touched (_: UIGestureRecognizer) {
//Segue to another viewcontroller
performSegueWithIdentifier("nice", sender: self)
}
(编辑:)我用在 Whosebug 上找到的信息更新了我的代码。我添加了 UIGestureRecognizerDelegate
:
class LampOn: UIViewController, UIGestureRecognizerDelegate {...}
并且我添加了shouldReceiveTouch
:
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
gestureRecognizer.delegate = self
if (touch.view == sliderValue){
print("touching slider")
return false
}
else{
print("touching elsewhere")
return true
}
}
但是控制台永远不会调用“shouldReceiveTouch”函数。那我错过了什么?我是否正确设置了委托?
永远不会调用 "shouldReceiveTouch" 函数,因为您在 "shouldReceiveTouch" 函数中设置了委托。在调用函数之前,需要将委托设置为 self。
您需要做的是在 viewDidLoad() 中设置委托,一切都应该没问题。
override func viewDidLoad() {
super.viewDidLoad()
let touch = UITapGestureRecognizer(target: self, action: "touched:")
self.view.addGestureRecognizer(touch)
touch.delegate = self
}