【问题标题】:Swift 3: UITapGestureRecognizer Not FiringSwift 3:UITapGestureRecognizer 未触发
【发布时间】:2016-11-23 03:48:00
【问题描述】:

我不知道为什么,但我的 UITapGestureRecognizer 没有正确触发。好吧,事实上它根本没有开火。我试图让一个功能在图像的水龙头上运行。

设置信息:

  • 不使用情节提要,以编程方式加载所有内容
  • 我正在加载它的视图上也有一个 UICollectionView

好的,代码如下:

UIImageView 是这样声明的:

let backButtonIcon: UIImageView = {
    let bbi = UIImageView()
    bbi.image = UIImage(named: "backIcon")
    bbi.translatesAutoresizingMaskIntoConstraints = false
    bbi.layer.zPosition = 2
    return bbi
}()

然后我将它添加到视图中:

view.addSubview(backButtonIcon)

将点击功能添加到我正在使用的 UIImageView:

let tapBackButton = UITapGestureRecognizer(target: self, action: #selector(backButtonPressed))
backButtonIcon.isUserInteractionEnabled = true
backButtonIcon.addGestureRecognizer(tapBackButton)

最后,这是我正在尝试运行的函数,目前只是一个简单的打印:

func backButtonPressed(sender: UITapGestureRecognizer) {
    print("Go Back Pressed")
}

更新:

我已经尝试添加:

 bbi.isUserInteractionEnabled = true

还有:

backButtonIcon.isUserInteractionEnabled = true

更新 2:

我创建了另一个空白视图,并完全按照此处的代码使用了代码,并且成功了。

会不会和 UICollectionView 有关系?

我将 UICollectionView zPosition 设为 -1,将 UIImageView zPosition 设为 1,但这也不起作用。

【问题讨论】:

  • 选择器似乎不正确,它至少应该因无法识别的选择器而崩溃。 backButtonIcon的superview到底是什么?
  • @Larme nope 没有崩溃。为什么不正确?
  • 当我没有维护对添加到的视图的引用(即变量)时,我遇到了手势识别器无法正常工作的问题。这是我的 SO 帖子:stackoverflow.com/questions/40144874/…
  • 您在生命周期的哪个阶段添加手势识别器?您添加子视图的顺序是什么?您在哪里/如何设置布局约束?更多上下文可能会有所帮助
  • @Brett 道歉。因此,手势识别器位于 View Did 加载中,而 collectionview 位于 ViewDidAppear 中。我尝试将其中一个添加到另一个,但它仍然没有工作。我是 Swift 编程的新手,因此缺乏上下文,如果你能让我知道该做什么以及如何找出我可以为你获取该信息:)

标签: ios swift uigesturerecognizer


【解决方案1】:

默认情况下,图像视图会忽略用户事件。通常,您使用图像视图仅在界面中呈现视觉内容。如果您还希望图像视图处理用户交互,请将其 isUserInteractionEnabled 属性的值更改为 true。之后,您可以附加手势识别器或使用任何其他事件处理技术来响应触摸事件或其他用户启动的事件。

来源:https://developer.apple.com/reference/uikit/uiimageview

【讨论】:

  • 嗯,它肯定会成为解决方案的一部分,所以不知道为什么投反对票
【解决方案2】:

我认为问题出在 UICollectionView,它由 UICollectionViewCells 组成,这些单元已经按定义启用了点击。

我正在浏览一个非常旧的应用程序 (Swift 1.x),我是为个人使用而编写的(因为它从未出现过),这就是我似乎在做的事情 - 你可能需要做一些变化其中:

  • 子类化 UICollectionViewCell 并添加 UILabel 和 UIImageView 作为子视图,填充它们(以及用于点击操作的 NSURL)。

  • 声明(并采用)一个特定的 UIViewController 作为我的 UICollectionView 委托(也出于我的目的,它是一个 SFSafariViewController 委托)。

  • 在那个 VC 的 viewDidLoad() 中,我确实设置了长按(用于删除)和双击(用于重新加载)手势,但 没有设置点按手势 - 不需要。

  • 在该 VC 的 viewDidLoad() 中,我加载(并填充)了单元格。

这是我认为您遇到的问题,但如果没有更多代码,我不确定:

  • 编码:

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if let cell = collectionView.cellForItemAtIndexPath(indexPath) as? BookmarkCell {
            selectedBookmarkSection = indexPath.section
            selectedBookmarkRow = indexPath.row
            sfc = SFSafariViewController(URL: cell.targetUrl!, entersReaderIfAvailable:true)
            sfc.delegate = self
            presentViewController(sfc, animated: true, completion: nil)
        } else {
            // Error indexPath is not on screen: this should never happen.
        }
    }
    

请善待,因为这是我在 2014 年 7 月写的! (我为 Swift 3.x 更新了 collectionView(didSelectItemAt:indexPath:) 但就是这样。)

TR;DR:我认为 - 特别是如果在 UICollectionView 之外看到您的点击 - 这可能会让您工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多