检测用户何时滚动MKMapView一定距离?

时间:2011-03-29 06:15:41

标签: iphone mapkit

我想确定用户是否滚动了超过某个百分比的地图,然后禁用该地图从用户位置居中(类似于地图应用的工作方式)。

我不确定使用哪种方法。

我认为创建一个矩形并查看矩形是否包含当前中心点是直截了当的,但我必须以IOS 3为目标,所以我无法使用许多较新的Mapkit apis。

我已尝试使用CLLocation,并在当前mapcenter和用户位置之间使用distanceFrom,但我试图弄清楚该距离是否为某个百分比。

3 个答案:

答案 0 :(得分:15)

我个人发现,如果有人可以发布一段代码而不是一般的散文关于如何解决这个问题,那会更有帮助。这就是我想出来的 - 大致已经被黑了,只是更好地回答这个问题:

在头文件中我有:

#define SCROLL_UPDATE_DISTANCE          80.00

在我的视图中(这是CLLocationManagerDelegate的委托,MKMapViewDelegate):

// this method is called when the map region changes as a delegate of MKMapViewDelegate
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    NSLog(@"regionDidChangeAnimated");
    MKCoordinateRegion mapRegion;   
    // set the center of the map region to the now updated map view center
    mapRegion.center = mapView.centerCoordinate;

    mapRegion.span.latitudeDelta = 0.3; // you likely don't need these... just kinda hacked this out
    mapRegion.span.longitudeDelta = 0.3;

    // get the lat & lng of the map region
    double lat = mapRegion.center.latitude;
    double lng = mapRegion.center.longitude;

    // note: I have a variable I have saved called lastLocationCoordinate. It is of type
    // CLLocationCoordinate2D and I initially set it in the didUpdateUserLocation
    // delegate method. I also update it again when this function is called
    // so I always have the last mapRegion center point to compare the present one with 
    CLLocation *before = [[CLLocation alloc] initWithLatitude:lastLocationCoordinate.latitude longitude:lastLocationCoordinate.longitude];
    CLLocation *now = [[CLLocation alloc] initWithLatitude:lat longitude:lng];

    CLLocationDistance distance = ([before distanceFromLocation:now]) * 0.000621371192;
    [before release];
    [now release];

    NSLog(@"Scrolled distance: %@", [NSString stringWithFormat:@"%.02f", distance]);

    if( distance > SCROLL_UPDATE_DISTANCE )
    {
        // do something awesome
    }

    // resave the last location center for the next map move event
    lastLocationCoordinate.latitude = mapRegion.center.latitude;
    lastLocationCoordinate.longitude = mapRegion.center.longitude;

}

希望能让你朝着正确的方向前进。

distanceFromLocation是iOS 3.2及更高版本。 initWithLatitude是iOS 2.0及更高版本。 MKCoordinateRegion是iOS 3.0及更高版本。 MKMapView centerCoordinate是iOS 3.0及更高版本。

另外 - 请随意跳进去,让我直接在我错误的地方。我自己也在考虑所有这些 - 但到目前为止,这对我来说相当不错。

希望这有助于某人。

答案 1 :(得分:3)

第一课:不要在深夜问问题。

第二课:您可以通过从用户的当前位置构建CGPoint和从MapView中心构建CGPoint来实现此目的。

有两个点,只需计算距离,看它是否超过某个阈值。

您还可以在地图中心周围构建CGRect,如果更容易,请检查CGRectContainsPoint。

- (BOOL) isUserPointInsideMapCenterRegion
{
    CLLocation * ul = _mapView.userLocation.location;

    CGPoint userPoint = [_mapView convertCoordinate: ul.coordinate toPointToView: _mapView];
    CGPoint mapPoint = [_mapView convertCoordinate: _mapView.centerCoordinate toPointToView: _mapView];

    if (fabs(userPoint.x - mapPoint.x) > MAP_CENTER_RECTANGLE_SIZE || fabs(userPoint.y - mapPoint.y) > MAP_CENTER_RECTANGLE_SIZE)
    {
        return NO;
    }

    return YES;
}

答案 2 :(得分:2)

我意识到这个问题现在有点老了,但我觉得this other question中描述的答案更加健壮,因为委托方法可能因任何原因被解雇。使用UIPanGestureRecognizer检测滚动意味着用户手动滚动地图,它可以检查地图是否滚动了X像素,而不是依赖于米,这意味着用户已经或多或少地滚动,具体取决于缩放级别。

https://stackoverflow.com/a/11675587/159758