SMCalloutViewを使用して、mapView のカスタム コールアウトを作成しています。私が直面している問題は、吹き出しビューが表示されているときにユーザーが吹き出しを押すと、別の注釈が吹き出しビューの下にある場合、現在選択されている注釈が閉じられ、表示されている吹き出しビューの下にある注釈が選択されます。
すべてのタッチ イベントをキャッチする UIView サブクラスを作成できるのではないかと考えました。そこで、UIView サブクラスを作成しました。mapView に直接追加すると、すべての関数が正しく起動します。しかし、ポップオーバーに使用すると、まったく機能しないようです。
import Foundation
import UIKit
class popOverSub: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
let myTap = UITapGestureRecognizer(target: self, action: "touchEventTest")
addGestureRecognizer(myTap)
userInteractionEnabled = true
backgroundColor = UIColor.greenColor()
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func touchEventTest() {
println("touchEventTest")
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
println("touch begins")
}
}
完成させるために、ここでカスタム CalloutView を呼び出します。
func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!) {
let popView = popOverSub(frame: CGRect(x: 0, y: 0, width: 100, height: 200))
calloutView.contentView = popView
self.calloutView.calloutOffset = CGPoint(x: view.frame.width*0.5, y: 0)
self.calloutView.delegate = self
calloutView.presentCalloutFromRect(calloutView.bounds, inLayer: view.layer, constrainedToLayer: self.mapView.layer, animated: true)
}
私は何をする必要がありますか。ユーザーが吹き出しビューを押した場合、吹き出しを閉じたり、下の mapView/Annotation にタッチ イベントを渡したりしません。代わりに、関数を呼び出す必要があります。どんなヒントも素晴らしいでしょう。