GestureRecognizer 没有响应点击
Posted
技术标签:
【中文标题】GestureRecognizer 没有响应点击【英文标题】:GestureRecognizer not responding to tap 【发布时间】:2014-09-25 00:07:45 【问题描述】:UIImageView
的子类初始化后,我有以下代码行:
self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
我创建了必要的关联函数:
func handleTap(gestureRecognizer: UITapGestureRecognizer)
print("In handler")
点击相关视图时,“In handler 从未打印到控制台”。然后我删除了处理函数,看看编译器是否会抱怨缺少的函数。没有。
我真的很难过。我真的很感激人们能对此有所启发。
更新:我的班级实际上是UIImageView
,而不是UIView
【问题讨论】:
试试self.view.addGestureRecognizer
我没有在Swift中尝试过,但这是我在Objective C中使用的。
我正在使用self.userInteractionEnabled
意味着这些代码sn-ps 实际上是在我感兴趣的我修改的视图中。因此,self.view
是不可能的!感谢您的贡献!
【参考方案1】:
我使用的是 UITapGestureRecognizer
,我使用 Storyboard 放置在 UILabel
上。
为了让它工作,我还必须在情节提要的 UILabel
属性检查器中标记为“用户交互已启用”的块中放置一个复选标记。
【讨论】:
是的,就是这样 - 自从我上次构建应用程序以来,我忘记了这一点。当您附加手势识别器时,似乎应该自动执行一些操作。 你刚刚节省了我的 30 分钟。 我不明白为什么默认禁用用户交互。【参考方案2】:我仔细梳理了我的代码后发现了答案。
其中一个父视图是在未提供 frame:
的情况下创建的
虽然这是一个足以保证删除此问题的错误,但很可能其他人将来也会遇到同样的问题...
【讨论】:
我现在也遇到了同样的问题。您是什么意思,其中一个父视图是在没有提供框架的情况下创建的?你是怎么做到的? 我遇到了同样的问题。我有一个带有 UIScrollView 子视图的视图,它有一个 UIImageView 子视图。我没有为 UIImageView 指定框架,这会阻止按钮工作。谢谢! 有谁知道为什么这会导致手势识别器无法检测到触摸......? 我无法得到它。我可以在哪里为 UIImageView 添加这个frame:
?
与无框架问题类似,我只是让 UITapGestureRecognizer 无法工作,因为视图的框架高度对于内容来说太小了(即使所有内容都很好地显示在显示器中)。可能是一个边缘案例,但添加此评论以防它对某人有所帮助。【参考方案3】:
试试这个
override func viewDidAppear(animated: Bool)
super.viewDidAppear(animated)
self.view.userInteractionEnabled = true
var tapGesture = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
self.view.addGestureRecognizer(tapGesture)
func handleTap(sender : UIView)
println("Tap Gesture recognized")
【讨论】:
谢谢,将 userInterActionEnabled 添加到我的 UIImageView 是我的解决方案。 将它放在 viewDidAppear 中并不好,因为您最终会添加大量手势 您可以在 viewDidAppear 中添加这些代码,然后在 viewDidDisappear 中删除手势识别器。这将解决添加到您的视图中的无限数量的手势识别器。【参考方案4】:除了其他答案之外,这可能是由于将手势识别器添加到多个视图而导致的。手势识别器仅适用于单个视图。
参考:https://***.com/a/5567684/6543020
【讨论】:
伟大的补充!【参考方案5】:我在程序化视图中遇到了这个问题。
我的带有手势识别器的 UIView 具有 .isUserInteractionEnabled = true,但在我为其父视图设置 .isUserInteractionEnabled = true 之前它不会响应点击。
【讨论】:
我正在做程序化视图,这就是为我做的。 惊人的答案,谢谢,它解决了我的问题。【参考方案6】:很可能您在错误的位置添加了UIGestureRecognizer
。这是来自storyboard
的UIView
的工作示例。如果您动态创建UIView
,那么您应该将此初始化放在正确的构造函数中。
class TestView: UIView
override func awakeFromNib()
self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
func handleTap(gestureRecognizer: UITapGestureRecognizer)
println("Here")
【讨论】:
【参考方案7】:经过多次反复试验,我找到了解决此问题的方法。所以有两个解决方案二这个
1. 在 viewDidLoad() 中添加 GestureRecognizer
并转
userInteractionEnabled
= true
2. 如果使用计算属性,请使用lazy var
而不是let
属性。
lazy var profileImageView: UIImageView =
let iv = UIImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
iv.image = #imageLiteral(resourceName: "gameofthrones_splash")
iv.contentMode = .scaleAspectFill
iv.translatesAutoresizingMaskIntoConstraints = false
iv.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSelectProfileImageView)))
iv.isUserInteractionEnabled = true
return iv
()
【讨论】:
你拯救了我的一天!【参考方案8】:此代码适用于 XCode 7.0.1
import UIKit
class ImageView: UIImageView
init(frame: CGRect, sender: Bool, myImage: UIImage)
super.init(frame: frame)
self.image = myImage
initBorderStyle(sender)
// enable user interaction on image.
self.userInteractionEnabled = true
let gesture = UITapGestureRecognizer(target: self, action: "previewImage:")
addGestureRecognizer(gesture)
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
func previewImage(myGesture: UITapGestureRecognizer? = nil)
print("i'm clicked")
private func initBorderStyle(sender: Bool)
self.layer.masksToBounds = true
self.layer.cornerRadius = 8
self.layer.borderWidth = 0.5
self.layer.borderColor = getBorderColor(sender)
self.backgroundColor = getColor(sender)
func getBorderColor(sender: Bool) -> CGColor
var result: CGColor
if sender
result = UIColor(red: 0.374, green: 0.78125, blue: 0.0234375, alpha: 0.5).CGColor
else
result = UIColor(red: 0.3125, green: 0.6015625, blue: 0.828125, alpha: 0.5).CGColor
return result
【讨论】:
【参考方案9】:Xcode 11.4 Swift 5.2
UserInteraction
默认在自定义 UIView
上启用
import UIKit
class YourView: UIView
override init(frame: CGRect)
super.init(frame: frame)
commonInit()
required init?(coder: NSCoder)
super.init(coder: coder)
commonInit()
func commonInit()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapped))
self.addGestureRecognizer(tapGesture)
@objc func tapped()
// do something
如果您想在其他地方收到通知自定义UIView
已被点击,那么使用Notification
会很方便。
最好将其创建为扩展,以防止它被字符串类型化。
extension Notification.Name
static let DidTapMyView = Notification.Name("DidTapMyView")
在您自定义的UIView
中调用function
时
@objc func tapped()
NotificationCenter.default.post(name: .DidTapMyView, object: self)
在你想收听Notification
的UIViewController
:
override func viewDidLoad()
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(myViewWasTapped), name: .DidTapMyView, object: nil)
@objc func myViewWasTapped()
// Notified here - do something
【讨论】:
【参考方案10】:对于即使使用所有以前的答案仍然有问题的任何人,请确保您使用的是 UITapGestureRecognizer
而不是 UIGestureRecognizer
,我在试图找出问题所在时一直错过这个细节。
【讨论】:
【参考方案11】:除了上述(userInteractionEnabled
、clipsToBounds
等)之外,如果您正在使用子视图控制器中的视图,请确保您已将其添加为带有 myParentViewController.addChild(myChildViewController)
的子视图——我们已经现在遇到了几种情况,可见视图没有触发识别手势,因为它们的视图控制器没有被添加,大概是 VC 本身没有被保留。
【讨论】:
感谢您发布此信息,我遇到了同样的问题并且很难调试。这帮助我找到了正确的位置!【参考方案12】:这是我在 2021 年 XCode 13 的发现列表:
确保您的视图及其所有超级视图都设置了宽度和高度限制(这一点至关重要) 设置isUserInteractionEnabled = true
供您查看
其他超级视图无需设置显式框架或isUserInteractionEnabled
【讨论】:
【参考方案13】:事实证明,我的手势不起作用,因为它属于普通类,而不是 UIView
的子类或任何东西。
我通过创建UIView
的子类解决了这个问题,我在这个普通类中有一个实例,并将手势逻辑放入其中。
【讨论】:
【参考方案14】:我通过将高度设置为 UIView 解决了我的问题。
optionView.heightAnchor.constraint(equalToConstant: 18).isActive = true
【讨论】:
【参考方案15】:我在以编程方式创建的 ViewController 中遇到了同样的问题。当我向视图添加背景颜色时,该错误已得到修复。
class ViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
view.backgroundColor = .systemBackground
let tap = UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing))
view.addGestureRecognizer(tap)
【讨论】:
我希望人们在投反对票时发表评论。看起来很奇怪,这对我有用。见***.com/questions/6010186/…以上是关于GestureRecognizer 没有响应点击的主要内容,如果未能解决你的问题,请参考以下文章
用Swift GestureRecognizer 的几个注意点
GestureRecognizer 开始时如何以编程方式关闭 clipsToBounds 属性?