Swift 3:UITapGestureRecognizer未触发

时间:2016-11-22 16:18:42

标签: ios swift uigesturerecognizer

我不确定为什么,但我的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)

将tap功能添加到我正在使用的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有关吗?

我在1处制作了UICollectionView zPosition -1和UIImageView zPosition,但是那个也没用。

2 个答案:

答案 0 :(得分:2)

图像视图默认忽略用户事件。通常,您只使用图像视图在界面中显示可视内容。如果您还希望图像视图处理用户交互,请将其isUserInteractionEnabled属性的值更改为true。完成此操作后,您可以附加手势识别器或使用任何其他事件处理技术来响应触摸事件或其他用户启动的事件。

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

答案 1 :(得分:0)

我认为问题在于UICollectionView,它由UICollectionViewCells组成,已经根据定义启用了点击。

我正在浏览一个非常古老的应用程序(Swift 1.x),我是为了个人使用而编写的(因为它从未见过光明的一天)而且这就是我的样子 - 你可能需要做一些变化这个:

  • Subclassed 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之外看到你的点击 - 这可能让你工作。