Swift:UITapGestureRecognizer - 无法监听 imageView 的手势

问题描述 投票:0回答:2

TapGestureRecognizer 这是使用点击手势识别器初始化图像视图的代码。

 var drawerImageView :UIImageView = {
            var drawerImageView = UIImageView()
            drawerImageView.image = UIImage(systemName: "list.dash")
            let tap = UITapGestureRecognizer(target: HomeViewController.self, action: #selector(tapFunction(sender:)))
            tap.numberOfTapsRequired = 1
            tap.numberOfTouchesRequired = 1
            drawerImageView.addGestureRecognizer(tap)
            drawerImageView.isUserInteractionEnabled = true
            return drawerImageView
        }()

下面我正在为图像视图设置约束。

  drawerImageView.translatesAutoresizingMaskIntoConstraints = false
        drawerImageView.leadingAnchor.constraint(equalTo: view.leadingAnchor,constant: 30).isActive = true
        drawerImageView.topAnchor.constraint(equalTo: view.topAnchor,constant: 40).isActive = true
        drawerImageView.widthAnchor.constraint(equalToConstant: 100).isActive = true
        drawerImageView.heightAnchor.constraint(equalToConstant: 100).isActive = true

问题是只有当我将 width height 设置为超过 200 时我才无法听到 taps,然后只有我收到 tap 事件。

这是上述点击手势的 objc 方法,需要调用此方法,但我无法在此处接收控件。 @objc func tapFunction(发件人:UITapGestureRecognizer){ 打印(“图像点击”) } 这个问题不清楚。

swift uitapgesturerecognizer tap
2个回答
0
投票

你的问题对我来说有点难以注意到。但我相信你在接收触摸事件时遇到问题,如果是这样,问题就是这个。

在计算变量之外编写触摸事件。

import UIKit

class ViewController: UIViewController {
    
    
    var drawerImageView :UIImageView = {
        var drawerImageView = UIImageView()
        drawerImageView.image = UIImage(systemName: "list.dash")
        drawerImageView.isUserInteractionEnabled = true
        return drawerImageView
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(drawerImageView)
        drawerImageView.translatesAutoresizingMaskIntoConstraints = false
        drawerImageView.leadingAnchor.constraint(equalTo: view.leadingAnchor,constant: 30).isActive = true
        drawerImageView.topAnchor.constraint(equalTo: view.topAnchor,constant: 40).isActive = true
        drawerImageView.widthAnchor.constraint(equalToConstant: 100).isActive = true
        drawerImageView.heightAnchor.constraint(equalToConstant: 100).isActive = true
        
        let tap = UITapGestureRecognizer(target: self, action: #selector(tapFunction(sender:)))
        tap.numberOfTapsRequired = 1
        tap.numberOfTouchesRequired = 1
        drawerImageView.addGestureRecognizer(tap)
        
    }
    
    @objc func tapFunction(sender:UITapGestureRecognizer) { print("image tap") }
    
    
}

如果你想在你的尺寸超过200时接收触摸,只需要在你的“tapFunction”中写一个if并检查你的图像尺寸是否超过200.


0
投票

这与图像的大小无关,您实现导航控制器的方式不好。看来您正在将图像定位在隐藏的 navigationController topbar 下(我只是突出显示了隐藏的部分)。更改图像的位置,您会看到点击已运行,或者如果您点击图像中不在礼帽后面的部分,您的触摸将再次起作用。所以你的图像部分位于导航栏后面,所以触摸不会响应它。我看到你的导航代码,它不合适。

另外,如果你让你的 rootViewcontroller 直接加载 HomeViewcontroller,你会看到你的代码工作得很好,因为你的 navigationController 不会中断你的触摸事件。

window.rootViewController =  HomeViewController()

© www.soinside.com 2019 - 2024. All rights reserved.