2

単純な NSTimer を使用して MKMapView をプログラムで回転させ、期待どおりに機能する MKMapCamera の見出しプロパティを常にインクリメントしています (マップがワシントン記念塔の周りをゆっくりと回転します)。

マップを中心を中心に回転させるのではなく、マップの下部を中心に回転させたい。ソリューションは単純で、マップの高さを 2 倍にしてから、画面の下部にある中心を中心に回転します。マップの高さを 2 倍にした後も、マップ フレームの中心ではなく、画面の中心を中心に回転します。

Apple は、MKMapView に追加のロジックを追加して、マップ フレームが何であれ、右下に「Legal」ラベルを保持しているように見えます。これもこの問題の原因であると思われます。

マップを中心ではなく、マップの下部を中心に強制的に回転させる方法はありますか?

- (void)setupMap {

    // Works as expected (rotates around center of screen)
    CGRect mapFrame = self.view.bounds; // works as expected

    // Doesn't work as expected (also rotates around the center of the screen)
    //mapFrame.size.height = self.view.frame.size.height*2;

    // Create/show MKMapView
    testMapView = [[MKMapView alloc] initWithFrame:mapFrame];
    [self.view addSubview:testMapView];

    // Zoom into the Washington Monument with a pitch of 60°
    MKMapCamera *aCamera = [MKMapCamera camera];
    [aCamera setCenterCoordinate:CLLocationCoordinate2DMake(38.8895, -77.0352)];
    [aCamera setAltitude:400];
    [aCamera setPitch:60];
    [testMapView setCamera:aCamera];

    // Begin rotating map every 1/10th of a second
    NSTimer *aTimer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(rotateMap) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:aTimer forMode:NSDefaultRunLoopMode];
}

- (void)rotateMap {
    MKMapCamera *aCamera = [testMapView camera];
    [aCamera setHeading:aCamera.heading+1];
    [testMapView setCamera:aCamera];
}
4

1 に答える 1

1

これは古い質問だと思いますが、これは非常にイライラする問題です。Autolayout と MapKit は内部でファンキーなことを行っています。ユーザーの位置を画面の中央に配置するために、mapView レンダリングがマップ ビューを自動的に中央に配置していることに気付きました。私がこれを行うまで、オフセット、制約、変換、スーパービューの量は、マップを画面の中央に配置できませんでした。

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
    CLLocationDegrees heading = newHeading.trueHeading >= 0 ? newHeading.trueHeading : newHeading.magneticHeading;

    //ACCOUNT FOR LANDSCAPE ORIENTATION IN HEADING
    if(self.interfaceOrientation == UIInterfaceOrientationLandscapeRight){
              heading += 180;
              if(heading > 360) heading -= 360;
    }

    //OFFSET MAP
    CGPoint p = [_mapView convertCoordinate:_currentLocation toPointToView:_mapView];
    CGPoint p2 = CGPointMake(p.x, p.y - MAP_VERTICAL_OFFSET);
    CLLocationCoordinate2D t = [_mapView convertPoint:p2 toCoordinateFromView:_mapView];

    [_aCamera setHeading:heading];
    [_aCamera setCenterCoordinate:t];
    [_mapView setCamera:_aCamera];

}
于 2014-01-23T21:53:20.730 に答える