Ios 使用swift为自定义控件指定两个不同的UITapgestureRecognitor
使用swift,我试图创建一个动态的通用控件来重用它,基本上,控件内部应该有一个通用的行为 更具体地说,我有一个Ios 使用swift为自定义控件指定两个不同的UITapgestureRecognitor,ios,swift,swift4,uitapgesturerecognizer,Ios,Swift,Swift4,Uitapgesturerecognizer,使用swift,我试图创建一个动态的通用控件来重用它,基本上,控件内部应该有一个通用的行为 更具体地说,我有一个uicrollview,它是用UIViews填充的,当你点击UIView时,背景应该会改变。 这是正确的 但是,对于实现,我的泛型控件类接受一个选择器作为参数 两者都是分开工作的,但一起工作是不起作用的 代码的具体部分是: 通用类 let clickAgendaEvent = UITapGestureRecognizer(target: self, action: #selector
uicrollview
,它是用UIViews
填充的,当你点击UIView
时,背景应该会改变。
这是正确的
但是,对于实现,我的泛型控件类接受一个选择器
作为参数
两者都是分开工作的,但一起工作是不起作用的
代码的具体部分是:
通用类
let clickAgendaEvent = UITapGestureRecognizer(target: self, action: #selector (self.agendaClicked (_:)))
cellSubView.addGestureRecognizer(clickAgendaEvent)
cell.addSubview(cellSubView)
let itemClickedEvent = UITapGestureRecognizer(target: viewController.self, action: self.agendaItemClicked! )
cell.addGestureRecognizer(itemClickedEvent)
以及具有如下实现的ViewController
:
@objc func eventDailyAgenda(sender:UIView!){
print("Item clicked!")
}
如您所见,第二个事件不在泛型类中,如果ViewController
,则第二个事件是一个单独的实现。
但是,泛型类将为其他UIViewController
实现
有人知道如何处理它吗?查看
UIgestureRecognitizerDelegate
以同时处理这两种手势。请查看回调手势识别器(:shouldlrecognizesimultaneouslywith:)
。返回true以同时处理两个手势。查看UIgestureRecognitizerDelegate
以同时处理两个手势。请查看回调手势识别器(:shouldlrecognizesimultaneouslywith:)
。返回true以同时处理这两个问题。更简单的方法是实现UIgestureRecognitizerDelegate
。
但是对于我的具体案例,没有起作用,因为我有不同的类来实现这个行为
但是,我找到了一种方法。
并且正在实现NSObject
(如果您在UIViewController
中,则不必实现它
就我的情况而言,我有自己的课程:
class MyClass:NSObject {
func createAll(){
let clickAgendaEvent = UITapGestureRecognizer(target: self, action: #selector (self.agendaClicked (_:)))
cellSubView.addGestureRecognizer(clickAgendaEvent)
cellSubView.tag = index
cell.addSubview(cellSubView)
}
@objc func agendaClicked(_ sender:AnyObject) {
baseView.setTransparentToSubViews()
print("Here")
let tap = sender as! UITapGestureRecognizer
tap.view?.backgroundColor = UIColor().hexStringToUIColor(hex: "#e0e0e0")
if let v = tap.view {
// use button
print("The tag is \(v.tag)")
}
if let c: NSObject.Type = NSClassFromString(viewController.className) as? NSObject.Type{
let c_tmp = c.init()
c_tmp.perform(Selector(("test")))
c.perform(Selector(("static_test")))
}
}
}
添加您的ViewController
@objc public func test(){
print("This is Test!!!")
}
@objc public class func static_test(){
print("This is Static Test")
}
这个扩展:
import Foundation
import UIKit
extension UIViewController {
var className: String {
return NSStringFromClass(self.classForCoder)
}
}
现在,您可以执行所需的所有方法
在这种情况下,一旦用户触摸一个元素,下一个事件将从该触摸触发,并且不需要添加新的代理
也许不是更好的方法,但完全是功能性的。更简单的方法是实现
UIgestureRecognitizerDelegate
。
但是对于我的具体案例,没有起作用,因为我有不同的类来实现这个行为
但是,我找到了一种方法。
并且正在实现NSObject
(如果您在UIViewController
中,则不必实现它
就我的情况而言,我有自己的课程:
class MyClass:NSObject {
func createAll(){
let clickAgendaEvent = UITapGestureRecognizer(target: self, action: #selector (self.agendaClicked (_:)))
cellSubView.addGestureRecognizer(clickAgendaEvent)
cellSubView.tag = index
cell.addSubview(cellSubView)
}
@objc func agendaClicked(_ sender:AnyObject) {
baseView.setTransparentToSubViews()
print("Here")
let tap = sender as! UITapGestureRecognizer
tap.view?.backgroundColor = UIColor().hexStringToUIColor(hex: "#e0e0e0")
if let v = tap.view {
// use button
print("The tag is \(v.tag)")
}
if let c: NSObject.Type = NSClassFromString(viewController.className) as? NSObject.Type{
let c_tmp = c.init()
c_tmp.perform(Selector(("test")))
c.perform(Selector(("static_test")))
}
}
}
添加您的ViewController
@objc public func test(){
print("This is Test!!!")
}
@objc public class func static_test(){
print("This is Static Test")
}
这个扩展:
import Foundation
import UIKit
extension UIViewController {
var className: String {
return NSStringFromClass(self.classForCoder)
}
}
现在,您可以执行所需的所有方法
在这种情况下,一旦用户触摸一个元素,下一个事件将从该触摸触发,并且不需要添加新的代理
也许不是更好的方法,但完全是功能性的。我认为您必须实现GestureDelegate,并为手势同时工作返回yes
扩展视图控制器:UIGestureRecognitizerDelegate{public func GestureRecognitizer(gestureRecognitizer:UIgestureRecognitizer,应与其他gestureRecognitizer:UIgestureRecognitizer同时识别)->Bool{return true}
我添加了它,但仍然没有启动两个。如果您在一个视图中添加一个手势,在另一个视图中添加另一个手势,我认为最前面的视图应该将事件传递到背景视图,或者将两个手势都添加到最前面的视图,并且仅将第二个手势添加到背景视图,我不知道您是否理解我说的话是的,我尝试过,但两者都可以在同一个IUView
组件中添加,第一个组件被激发,但第二个组件不被激发我认为您必须实现GestureDelegate并为手势同时工作返回yesextension ViewController:UIGestureRecognitizerDelegate{public func GestureRecognitizer(gestureRecognitizer:UIgestureRecognitizer,应与其他gestureRecognitizer:UIgestureRecognitizer同时识别)->Bool{return true}
我添加了它,但仍然没有启动两个。如果您在一个视图中添加一个手势,在另一个视图中添加另一个手势,我认为最前面的视图应该将事件传递到背景视图,或者将两个手势都添加到最前面的视图,并且仅将第二个手势添加到背景视图,我不知道您是否理解我说的话是的,我尝试过,但两者都可以在同一个IUView
组件中添加,第一个被激发,但第二个没有。我刚刚添加了函数func gestureRecognitizer(gestureRecognitizer:uigestureRecognitizer,应该与其他gestureRecognitizer:uigestureRecognitizer同时识别)->Bool{return true}
并实现了UIgestureRecognitizerDelegate
,但现在仍在调用这两个代理。对于我的具体情况,我应该创建一个平移手势来分配它吗?我刚刚添加了函数func gestureRecognitizer(\ugestureRecognitizer:UIgestureRecognitizer,应该与其他gestureRecognitizer:UIgestureRecognitizer同时识别)->Bool{return true}
和implementedUIgestureRecognitizerDelegate
但是,现在仍在调用两者。对于我的特定情况,我应该创建一个平移手势来分配它吗?