Новая четкая карта места - программирование
Подтвердить что ты не робот

Новая четкая карта места

Мне очень нравится, как четвёрка спроектировала детальный просмотр места. Особенно карта с местом встречи в "заголовке" обзора... Как это было сделано? Подробности, очевидно, являются некоторыми uiscrollview (возможно, uitableview?), А за ним (в заголовке) есть карта, поэтому, когда вы просматриваете карту, ее раскрывают, поскольку просмотр прокрутки отскакивает... есть ли у кого-нибудь идея, как это сделать?

enter image description here

4b9b3361

Ответ 1

Вот как мне удается воспроизвести его: -

Вам нужно UIViewController с UIScrollView в качестве его вида. Затем содержимое UIView, которое вы добавляете в свой scrollview, должно выглядеть следующим образом: -

enter image description here - Кадр MKMapView имеет отрицательную позицию y. В этом случае мы можем видеть только 100pts карт в состоянии по умолчанию (перед перетаскиванием).
- Вам нужно отключить масштабирование и прокрутку на вашем экземпляре MKMapView.

Затем трюк должен перемещаться вниз по centerCoordinate MKMapView при перетаскивании вниз и отрегулировать его центральное положение.

Для этого мы вычисляем, как много 1point представляет собой дельта-широту, так что мы знаем, насколько координата центра карты должна перемещаться при перетаскивании х точек на экране: -

- (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;
}

После инициализации этих свойств нам необходимо реализовать поведение UIScrollViewDelegate. Когда мы перетаскиваем, мы преобразуем движение, выраженное в точках, в широту. И затем мы перемещаем центр карты, используя половину этого значения.

- (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;
    }
}

Вы получаете то же поведение, что и приложение foursquare (но лучше: в приложении с четырьмя квадратами, рецензент карт имеет тенденцию прыгать, здесь изменение центра выполняется плавно).

sasiW.pngcFzex.png

Ответ 2

Приведенный выше пример хорош. Если вам нужна дополнительная помощь, я думаю, что они используют что-то очень похожее на RBParallaxTableViewController. https://github.com/Rheeseyb/RBParallaxTableViewController

Это по сути тот же эффект, что и Path для его заголовка.

Ответ 3

Ответ на Yonel хорош, но я нашел проблему, поскольку у меня есть булавка в центре карты. Поскольку отрицательный Y, точка скрыта под моим UINavigationBar.

Тогда я не установил отрицательный Y, и я исправляю свой mapView.frame в соответствии со сдвигом прокрутки.

Мой mapView - 320 x 160

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

Надеюсь, это поможет кому-то.