UIImageView
のサブクラスによる初期化の後、次のコード行があります。
self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
必要な関連関数を作成しました:
func handleTap(gestureRecognizer: UITapGestureRecognizer) {
print("In handler")
}
問題のビューをタップすると、「Inハンドラーがコンソールに出力されなかった」。次に、ハンドラー関数を削除して、コンパイラーが関数の欠落について文句を言うかどうかを確認しました。しませんでした。
私は前向きに困惑しています。どんな軽い人でもこれを当てることができれば本当にありがたいです。
更新:私のクラスは、実際にはUIImageView
ではなくUIView
です
コードを注意深く調べた結果、答えが見つかりました。
frame:
を指定せずに、親ビューの1つが作成されました
この質問の削除を正当化するのに十分なエラーではありませんが、将来、他の誰かが同じ問題を抱えることになる可能性があります...
これを試して
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")
}
ほとんどの場合、UIGestureRecognizer
を間違った場所に追加します。 UIView
のstoryboard
を使用した作業サンプルです。 UIView
を動的に作成する場合、この初期化を正しいコンストラクターに配置する必要があります。
class TestView: UIView
{
override func awakeFromNib()
{
self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
}
func handleTap(gestureRecognizer: UITapGestureRecognizer)
{
println("Here")
}
}
他の回答に加えて、これはジェスチャ認識機能を複数のビューに追加することで発生する可能性があります。ジェスチャレコグナイザーは、シングルビュー専用です。
私はプログラムの観点からこの問題に遭遇しました。
ジェスチャレコグナイザーを使用したUIViewには.isUserInteractionEnabled = trueがありましたが、親ビューにも.isUserInteractionEnabled = trueを設定するまでタップに応答しませんでした。
試行錯誤の末、この問題の解決策を見つけました。したがって、2つのソリューション2つがあります
1。 viewDidLoad()にGestureRecognizer
を追加し、userInteractionEnabled
= true
をオンにします
2。計算されたプロパティを使用する場合、プロパティにlet
の代わりにlazy var
を使用します。
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
}()
このコードは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
}
}
通常のクラスであり、UIView
などのサブクラスではないため、私のジェスチャーは機能しませんでした。
この通常のクラスのインスタンスを持っているUIView
のサブクラスを作成することで問題を解決し、その中にジェスチャーロジックを配置しました。