在UIImageView
的子类初始化之后,我有以下代码行:
self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
我创建了必要的相关功能:
func handleTap(gestureRecognizer: UITapGestureRecognizer) {
print("In handler")
}
在点击有问题的视图时,"在处理程序中从未打印到控制台"。然后我删除了处理函数,看看编译器是否会抱怨丢失的函数。它没有。
我很难过。我真的很感激任何光明人都可以放弃这一点。
更新:我的课程实际上是UIImageView
而不是UIView
答案 0 :(得分:111)
答案 1 :(得分:14)
试试这个
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")
}
答案 2 :(得分:13)
在仔细梳理我的代码后,我发现了答案。
其中一个父视图是在未提供frame:
虽然这是一个足够错误的错误以保证删除这些问题,但是其他人在将来也会遇到同样的问题......
答案 3 :(得分:7)
您最有可能在错误的地方添加UIGestureRecognizer
。以下是来自UIView
的{{1}}的工作示例。如果您动态创建storyboard
,则应将此初始化置于正确的构造函数中。
UIView
答案 4 :(得分:6)
除了其他答案之外,这可以通过将手势识别器添加到多个视图来引起。手势识别器仅适用于单一视图。
答案 5 :(得分:4)
我在程序化视图中遇到了这个问题。
我的带有手势识别器的UIView的值为.isUserInteractionEnabled = true,但是直到我为其父级视图也将.isUserInteractionEnabled = true设置为真时,它才对点击做出响应。
答案 6 :(得分:1)
此代码适用于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
}
}
答案 7 :(得分:1)
经过大量的试验和错误,我找到了解决这个问题的方法。所以有两个解决方案,这个
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 :(得分:1)
此外,以上(userInteractionEnabled
,clipsToBounds
等)如果在子视图控制器中使用视图,请确保已将其添加为{{1 }} —现在,我们遇到了两种情况,其中可见视图由于未添加视图控制器而无法触发识别手势,并且大概还没有保留VC。
答案 9 :(得分:1)
Xcode 11.4 Swift 5.2
默认情况下,在自定义Prelude> data A' = A' { getA :: Int }
Prelude> (37 :: Int) :: A'
<interactive>:12:2: error:
• Couldn't match expected type ‘A'’ with actual type ‘Int’
• In the expression: (37 :: Int) :: A'
In an equation for ‘it’: it = (37 :: Int) :: A'
上启用了 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)
}
中要收听UIViewController
的地方:
Notification
答案 10 :(得分:1)
对于即使使用之前的所有答案仍然有问题的任何人,请确保您使用的是 UITapGestureRecognizer
而不是 UIGestureRecognizer
,我一直在试图找出问题所在时遗漏了这个细节。>
答案 11 :(得分:0)
原来,我的手势不起作用,因为它属于普通类,而不是UIView
的子类。
我通过创建一个UIView
的子类来解决该问题,该子类在该普通类中有一个实例,并将手势逻辑放入其中。
答案 12 :(得分:0)
我通过将高度设置为UIView解决了我的问题。
optionView.heightAnchor.constraint(equalToConstant: 18).isActive = true
答案 13 :(得分:0)
这是我在 2021 年的发现列表,XCode 13:
isUserInteractionEnabled = true
isUserInteractionEnabled
答案 14 :(得分:-1)
我在以编程方式创建的 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)
}
}