如何以编程方式将手势识别器添加到自定义UIView(XIB)?

时间:2017-06-15 19:00:36

标签: ios swift uiview uitapgesturerecognizer

简介

我尝试在自定义UIViewCardView的实例中添加点按识别器。所以我创建了一个自定义视图xib并通过CardView.swift链接我的Swift类文件File's Owner。之后,我将每个插座连接到相应的UI元素。

我想以编程方式将自定义视图CardView添加到我的ViewController,并将tapGesture附加到新创建的视图。

CardView类:

class CardView: UIView {

    // Delcare outlets
    @IBOutlet var view: UIView!
    @IBOutlet weak var title: UILabel!
    @IBOutlet weak var icon: UIImageView!


    //MARK: Initialization
    override init(frame: CGRect) {
        super.init(frame: frame)

        Bundle.main.loadNibNamed("CardView", owner: self, options: nil)
        addSubview(view)
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
    }

}

ViewController类

在ViewController.swift的viewDidLoad()函数中,我创建了一个CardView()实例:

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

        let cardView = CardView()
        self.view.addSubview(cardView)

        // Style cardView instance
        cardView.view.backgroundColor = UIColor.yellow
        cardView.view.center.x = self.view.center.x
        cardView.view.center.y = self.view.center.y

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(gestureRecognizer:)))
        cardView.addGestureRecognizer(tapGesture)

    }

我将tapGesture添加到我的cardView,就像使用Swift一样正常:

let tapGesture = UIPanGestureRecognizer(target: self, action: #selector(handleTap(gestureRecognizer:)))    cardView.addGestureRecognizer(panGesture)

并添加要调用的相应函数:

func handleTap(gestureRecognizer: UIGestureRecognizer) {
        let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }

主要问题/问题

我在新创建的CardView(CardView的一个实例)中添加一个点击手势识别器时遇到的问题是,函数handleTap()从未被调用过。

我已经尝试了几项内容,例如将cardView.isUserInteractionEnabled = true添加到两个文件(ViewController.swiftCardView.swift类)。还要添加其中一个文件,而不是另一个。

在声明手势类型后,我还尝试将其添加到超级视图中,即与ViewController.swift file链接的视图。当我点击屏幕时,将触发该功能,但不会使用我自己创建的自定义UIView。

除了那些我还尝试将UIGestureRecognizerDelegate添加到我的VC类而没有结果。

class ViewController: UIViewController, UIGestureRecognizerDelegate {}

在我将手势连接到viewDidLoad()之前的cardView功能中,我添加了额外的一行:tapGesture.delegate = self

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(gestureRecognizer:)))
tapGesture.delegate = self
architectView.addGestureRecognizer(tapGesture)

2 个答案:

答案 0 :(得分:0)

我在使用自定义 UIView 时遇到了同样的问题。

我制作了 Xibswift 文件并将其连接起来。 然后给 UIView 添加手势,但是,它不起作用。 我将 UIView 更改为 UIButton 以解决问题,但不起作用。

解决我的问题是

自动布局问题

当我运行应用程序并通过 Debug 视图层次结构 进行调试时,有歧义 我的 customUIView 有问题。

通过打印 UIView 的描述,我可以通知它有 frame(0,0),另一方面 subView 有自己的 frame。

所以我从头开始删除并制作,每次运行测试并解决它。 单击自定义 UIView 时,手势功能也有效。

我希望这对你有用。我看到了您的代码,您的代码似乎没有问题,因此请检查 xib 文件并自动布局这些标签和图像。

答案 1 :(得分:-1)

使用

更正UIPanGestureRecognizer(target: self, action: #selector(dragged))
UIPanGestureRecognizer(target: self, action: #selector(dragged(sender:)))