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



Intro

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

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

卡片视图类:

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 的viewDidLoad()函数中.swift我创建了一个 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 {}

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

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

我在自定义UIView上遇到了同样的问题。

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

解决我的问题就是

自动布局问题

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

通过UIView的打印描述,我可以通知它有框架(0,0),另一方面子视图有自己的框架。

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

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

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

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

最新更新