2016-08-07 4 views
1

をアウトコール:ユーザーがピンを押すポジションは、私は次のコードに追加されたカスタム吹き出しビューで<code>MKAnnotation</code>を持つビューの上にピンスウィフトIOS MKMapView

func mapView(mapView: MKMapView, 
      didSelectAnnotationView view: MKAnnotationView) 
{ 

    if view.annotation is MKUserLocation 
    { 
     return 
    } 


    let customAnnotation = view.annotation as! MyAnnotation 

    if (applicable) { 
     let calloutView = CustomCallout() 
     var r : MKMapRect = largeMapView.visibleMapRect 
     let p : MKMapPoint = MKMapPointForCoordinate(customAnnotation.coordinate) 
     r.origin.x = p.x - r.size.width * 0.5 
     r.origin.y = p.y - r.size.height * 0.75 

     // 3 

     calloutView.translatesAutoresizingMaskIntoConstraints = false 
     calloutView.imageView.translatesAutoresizingMaskIntoConstraints = false 

     calloutView.clipsToBounds = true 
     calloutView.imageView.clipsToBounds = true 

     let mapPointCoordinate : CLLocationCoordinate2D = MKCoordinateForMapPoint(p) 
     let pointAsCGPoint : CGPoint = self.largeMapView.convertCoordinate(mapPointCoordinate, toPointToView: self.largeMapView) 
     calloutView.frame = CGRectMake(pointAsCGPoint.x, pointAsCGPoint.y, viewWidth! * 0.6, (viewHeight! - 110) * 0.6) 
     calloutView.addSubview(calloutView.imageView) 
     view.addSubview(calloutView) 


     view.addConstraint(NSLayoutConstraint(item: calloutView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: (viewHeight! - 110) * 0.6)) 
     view.addConstraint(NSLayoutConstraint(item: calloutView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: viewWidth! * 0.6)) 
     calloutView.addConstraint(NSLayoutConstraint(item: calloutView.imageView, attribute: .Top, relatedBy: .Equal, toItem: calloutView, attribute: .Top, multiplier: 1, constant: 0)) 
     calloutView.addConstraint(NSLayoutConstraint(item: calloutView.imageView, attribute: .Bottom, relatedBy: .Equal, toItem: calloutView, attribute: .Bottom, multiplier: 1, constant: 0)) 
     calloutView.addConstraint(NSLayoutConstraint(item: calloutView.imageView, attribute: .Leading, relatedBy: .Equal, toItem: calloutView, attribute: .Leading, multiplier: 1, constant: 0)) 
     calloutView.addConstraint(NSLayoutConstraint(item: calloutView.imageView, attribute: .Trailing, relatedBy: .Equal, toItem: calloutView, attribute: .Trailing, multiplier: 1, constant: 0)) 


     largeMapView.setVisibleMapRect(r, animated: true) 

    } 


} 

、私は水平になるように地図を動かします押し付けられたピンに対する比率で、中央に、垂直に設定されます。今、私はCustomCallOutをピンのすぐ上の中央に配置しようとしていますが、私が何をしていても、それは画面上で不規則に位置しているようです。

+0

「不安定」を定義...左、右、上下、横などですか? –

+0

それは時にはピンの側にあるもの、時にはそのピンの上の他の時、ピンは基本的にビューの真ん中にある...不安定なことは私が定義できる唯一の方法です – Alk

+0

それはおそらくどこですか最初にピンを再センタリングする前にタップしていますか? –

答えて

1

自動レイアウトを使用する場合、frameの値を調整する必要はなく、マップ座標に心配する必要もありません。アノテーションビューを基準にして制約を追加するだけです。

例えば、これは右MKPinAnnotationView上に60x30であるブランクグレー吹き出しビューを追加:

func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) { 
    let calloutView = UIView() 
    calloutView.translatesAutoresizingMaskIntoConstraints = false 
    calloutView.backgroundColor = UIColor.lightGrayColor() 
    view.addSubview(calloutView) 

    NSLayoutConstraint.activateConstraints([ 
     calloutView.bottomAnchor.constraintEqualToAnchor(view.topAnchor, constant: 0), 
     calloutView.widthAnchor.constraintEqualToConstant(60), 
     calloutView.heightAnchor.constraintEqualToConstant(30), 
     calloutView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor, constant: view.calloutOffset.x) 
    ]) 
} 

したがって、MKAnnotationViewに対してあるとコールアウトの底アンカーを設定し、centerXに設定しますcalloutOffsetによって相殺されます。

吹き出しの内容とサイズを任意に設定できますが、注釈ビューの中央に配置されたカスタム吹き出しビューを取得する方法を示していることを願います。

+0

ありがとう、これは本当に助け、それはそれほど簡単に行うことができるか分からなかった:) – Alk

関連する問題