2015-09-15 28 views
14

Sau khi xem WWDC video 206 Tôi cho rằng đây sẽ là một nhiệm vụ tầm thường khi thêm chế độ xem chú thích chi tiết vào chế độ xem chú thích mapView.MapKit iOS 9 detailCalloutAccessoryXem sử dụng

Vì vậy, tôi giả định Im đang làm điều gì đó sai.

Với tầm nhìn pin của tôi thiết lập

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 

    let view:MKAnnotationView! 

    if let dequed = routeMapView.dequeueReusableAnnotationViewWithIdentifier("pin") { 
     view = dequed 
    } 
    else { 
     view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin") 
    } 

    let x = UIView(frame: CGRectMake(0, 0, 200, 200)) 
    x.backgroundColor = UIColor.redColor() 

    // shows the red 
    //view.leftCalloutAccessoryView = x 

    // working as no subtitle - but no red view 
    view.detailCalloutAccessoryView = x 

    view.canShowCallout = true 
    return view 
} 

tôi chỉ có được điều này

enter image description here

tôi biết quan điểm đang làm việc, bởi vì nếu tôi thử nó với leftCalloutAccessoryView tôi nhận được enter image description here

Tôi phải thiếu điều gì đó. Lưu ý, nếu tôi chỉ cần thêm một hình ảnh để các detailCalloutAccessoryView như

view.detailCalloutAccessoryView = UIImage(named:"YourImageName") 

Hình ảnh là có, kích thước chính xác vv

Tôi chỉ không thể tìm ra cách để đưa vào giao diện tùy chỉnh của riêng tôi.

Cảm ơn

Trả lời

14

Bạn có thêm một số trở ngại cho chiều rộng và chiều cao của tầm nhìn của bạn:

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
    var av = mapView.dequeueReusableAnnotationViewWithIdentifier("id") 
    if av == nil { 
     av = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "id") 
    } 

    let myView = UIView() 
    myView.backgroundColor = .greenColor() 

    let widthConstraint = NSLayoutConstraint(item: myView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 40) 
    myView.addConstraint(widthConstraint) 

    let heightConstraint = NSLayoutConstraint(item: myView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 20) 
    myView.addConstraint(heightConstraint) 

    av!.detailCalloutAccessoryView = myView 
    av!.canShowCallout = true 

    return av! 
} 

Munich 1972

Thêm một intrinsicContentSize cũng làm việc.

Tôi đã thực hiện một số kiểm tra và phát hiện, rằng MapKit tự động đặt translatesAutoresizingMaskIntoConstraints thành sai, khi bạn đặt chế độ xem thành detailCalloutAccessoryView.

Trong phiên WWDC 2015 "What's New in MapKit" người ta nói rằng "bố cục tự động được hỗ trợ". Tôi nghĩ rằng Apple thực sự có nghĩa là, rằng bạn phải sử dụng bố trí tự động ?!

+0

yeah thats it, nice work. – DogCoffee

+3

Làm cách nào để loại bỏ khoảng cách được thêm xung quanh 'detailCalloutAccessoryView'? @Klaas – ScottOBot

+0

@ScottOBot chưa bao giờ thử điều đó. Nhưng nó có thể có thể bằng cách sử dụng .Top, .Left, .Bottom và .Right constraints thay vì .Width và .Height? – Klaas

0

Sử dụng UIImageView

view.detailCalloutAccessoryView = UIImageView(image:UIImage(named:"YourImageName")) 
+0

Làm cho nó hoạt động với chế độ xem hình ảnh và hình ảnh là tốt. Tôi muốn sử dụng chế độ xem tùy chỉnh. – DogCoffee

8

1. Tạo một UIView và thêm nó vào bạn bản đồ VC trong Storyboard

enter image description here

đây bạn có thể thiết lập kích thước , các ràng buộc, thêm các nút, hình ảnh, vv - bố trí cách bạn muốn. Chế độ xem ngăn xếp hoạt động hoàn hảo trong trường hợp này.

2. Tạo và ổ cắm để Maps VC

kiểm soát kéo bạn theo thường lệ, từ giao diện tùy chỉnh của bạn.

@IBOutlet var customDetailView: UIView! 

3. Đặt detailCalloutAccessoryView cho pin của bạn

Ví dụ

func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) { 
    view.detailCalloutAccessoryView = customDetailView 
} 

Success

enter image description here

+2

Điều này có vẻ hiển nhiên nhưng nó bắt tôi trong vài phút ... Cố gắng kéo UIView vào không gian mở trong bảng phân cảnh không hoạt động. Bạn cần phải kéo nó vào thanh trên cùng UIViewController bạn muốn sử dụng nó trong. Giống như bên cạnh vòng tròn màu vàng, hộp màu đỏ vv ... –

+1

@ByronCoetsee, đó là tuyệt vời, có lẽ là tuyệt vời như câu trả lời. Tôi tự hỏi tại sao Apple lại làm loại trứng Phục sinh này? – Eduardo

+0

Tuyệt vời! Tôi đã tự hỏi làm thế nào tôi có thể cá nhân hoá nó ... Đặt một nút và làm cho nó làm một số hành động, và nhãn tùy chỉnh với văn bản năng động ... Bạn có thể đưa ra một số ý tưởng? Cảm ơn! – Cleversou

Các vấn đề liên quan