2012-06-11 26 views
16

Tôi thực sự thích cách thiết kế chế độ xem chi tiết địa điểm được thiết kế. Đặc biệt là bản đồ với vị trí địa điểm trong "tiêu đề" của xem ... Làm thế nào nó được thực hiện? Thông tin chi tiết rõ ràng là một số uiscrollview (có thể là uitableview?) Và đằng sau nó (trong phần đầu) có một bản đồ nên khi bạn cuộn lên bản đồ là beeing uncovered khi cuộn xem bị trả lại ... có ai có ý tưởng làm thế nào để làm điều này?Bản đồ chi tiết bản đồ địa điểm mới

enter image description here

+0

Tôi đã chỉnh sửa câu trả lời của mình, bây giờ việc triển khai hoàn hảo;) – yonel

Trả lời

32

Dưới đây là cách tôi quản lý để tái tạo nó: -

Bạn cần một UIViewController với một UIScrollView như quan điểm của mình. Sau đó, nội dung của UIView bạn thêm vào scrollview của bạn sẽ giống như thế này: -

enter image description here - Khung các MKMapView có một âm y vị trí. Trong trường hợp này, chúng ta chỉ có thể thấy 100 bản đồ trong trạng thái mặc định (trước khi kéo).
- Bạn cần tắt thu phóng và cuộn trên bản sao MKMapView của mình.

Sau đó, mẹo là di chuyển xuống số centerCoordinate của số MKMapView khi bạn kéo xuống và điều chỉnh vị trí trung tâm của nó.

Đối với đó, chúng tôi tính toán bao nhiêu 1point đại diện như một vĩ độ vùng đồng bằng để chúng ta biết trung tâm phối hợp bao nhiêu bản đồ nên được di chuyển khi bị kéo điểm x trên màn hình: -

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIScrollView* scrollView = (UIScrollView*)self.view; 
    [scrollView addSubview:contentView]; 
    scrollView.contentSize = contentView.frame.size; 
    scrollView.delegate = self; 
    center = CLLocationCoordinate2DMake(43.6010, 7.0774); 
    mapView.region = MKCoordinateRegionMakeWithDistance(center, 1000, 1000); 
    mapView.centerCoordinate = center; 
    //We compute how much latitude represent 1point. 
    //so that we know how much the center coordinate of the map should be moved 
    //when being dragged. 
    CLLocationCoordinate2D referencePosition = [mapView convertPoint:CGPointMake(0, 0) toCoordinateFromView:mapView]; 
    CLLocationCoordinate2D referencePosition2 = [mapView convertPoint:CGPointMake(0, 100) toCoordinateFromView:mapView]; 
    deltaLatFor1px = (referencePosition2.latitude - referencePosition.latitude)/100; 
} 

Khi các thuộc tính đó được khởi tạo, chúng ta cần thực hiện hành vi của UIScrollViewDelegate. Khi chúng tôi kéo, chúng tôi chuyển đổi di chuyển được biểu thị bằng điểm thành vĩ độ. Và sau đó, chúng tôi di chuyển trung tâm của bản đồ bằng cách sử dụng một nửa giá trị này.

- (void)scrollViewDidScroll:(UIScrollView *)theScrollView { 
    CGFloat y = theScrollView.contentOffset.y; 
    // did we drag ? 
    if (y<0) { 
     //we moved y pixels down, how much latitude is that ? 
     double deltaLat = y*deltaLatFor1px; 
     //Move the center coordinate accordingly 
     CLLocationCoordinate2D newCenter = CLLocationCoordinate2DMake(center.latitude-deltaLat/2, center.longitude); 
     mapView.centerCoordinate = newCenter; 
    } 
} 

Bạn có được hành vi tương tự như ứng dụng bản đồ có xu hướng nhảy, tại đây, thay đổi trung tâm được thực hiện thuận lợi).

+0

wow, đây là câu trả lời tuyệt vời ... cảm ơn rất nhiều!xin lỗi vì sự chậm trễ khi đánh dấu nó như đã giải quyết - tôi đã đi nghỉ ... dù sao ... tôi đã tự làm nó sau một thời gian và nó tương tự như giải pháp của bạn ... sự khác biệt duy nhất là khi tôi cuộn tôi làm mới toàn bộ mapView, thiết lập vùng hiển thị mới (nếu bạn cuộn rất nhiều bản đồ được phóng to) ... tôi thích giải pháp của bạn chỉ bằng cách thiết lập trung tâm bản đồ mới, cách của nó nhanh hơn nhiều so với giải pháp của tôi vì vậy tôi sẽ cập nhật mã của mình ... Một lần nữa, xin cảm ơn rất nhiều ! :) –

+0

Bạn có thể giải thích cách bạn tính deltaLatFor1px trong viewDidLoad đặc biệt là referencePosition. Tôi gặp sự cố ứng dụng với mã nói rằng có sự cố với tọa độ địa lý không hợp lệ. Cảm ơn bạn! – MrBr

+0

Thực ra những gì tôi đang làm là tôi tạo ra hai vị trí màn hình, với 100px giữa chúng. Sau đó, tôi chuyển đổi các vị trí màn hình đó thành vị trí bản đồ. Sau đó, tôi biết bao nhiêu vĩ độ 100px đại diện. Và sau đó thật dễ dàng để biết có bao nhiêu vĩ độ được biểu diễn bằng 1px (vĩ độ delta giữa 2 vị trí màn hình chia cho 100). – yonel

2

Ví dụ trên là tốt đẹp. Nếu bạn cần thêm trợ giúp, tôi nghĩ rằng họ đang sử dụng một cái gì đó rất giống với RBParallaxTableViewController. https://github.com/Rheeseyb/RBParallaxTableViewController

Về cơ bản nó có cùng tác dụng mà Path sử dụng cho ảnh tiêu đề của nó.

0

Câu trả lời của Yonel rất hay, nhưng tôi đã gặp sự cố khi tôi có một chiếc ghim ở chính giữa bản đồ. Vì Y âm, điểm được ẩn dưới UINavigationBar của tôi.

Sau đó, tôi đã không đặt Y âm và tôi sửa mapView.frame của mình theo độ lệch cuộn.

My MapView là 320 x 160

_mapView.frame = CGRectMake(0, 160, 320, -160+y); 

Hope this helps một ai đó.