Ответ 1
Вот как мне удается воспроизвести его: -
Вам нужно UIViewController
с UIScrollView
в качестве его вида. Затем содержимое UIView
, которое вы добавляете в свой scrollview, должно выглядеть следующим образом: -
- Кадр
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 (но лучше: в приложении с четырьмя квадратами, рецензент карт имеет тенденцию прыгать, здесь изменение центра выполняется плавно).