[core, ios, osx] Tilt around visual center point

The tilt gesture on both iOS and OS X now respects the content insets. On iOS, in user tracking mode, it additionally respects the user dot’s position if it’s aligned to the top or bottom of the view.
This commit is contained in:
Minh Nguyễn
2016-01-26 16:59:54 -08:00
committed by Minh Nguyễn
parent 97fc2120c4
commit 8a23bdcd01
7 changed files with 30 additions and 6 deletions

View File

@@ -130,6 +130,7 @@ public:
// Pitch
void setPitch(double pitch, const Duration& = Duration::zero());
void setPitch(double pitch, const PrecisionPoint&, const Duration& = Duration::zero());
double getPitch() const;
// North Orientation

View File

@@ -680,11 +680,12 @@ jdouble JNICALL nativeGetPitch(JNIEnv *env, jobject obj, jlong nativeMapViewPtr)
return nativeMapView->getMap().getPitch();
}
void JNICALL nativeSetPitch(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jdouble pitch, jlong duration) {
void JNICALL nativeSetPitch(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jdouble pitch, jlong milliseconds) {
mbgl::Log::Debug(mbgl::Event::JNI, "nativeGetPitch");
assert(nativeMapViewPtr != 0);
NativeMapView *nativeMapView = reinterpret_cast<NativeMapView *>(nativeMapViewPtr);
nativeMapView->getMap().setPitch(pitch, mbgl::Milliseconds(duration));
mbgl::Duration duration((mbgl::Milliseconds(milliseconds)));
nativeMapView->getMap().setPitch(pitch, duration);
}
void JNICALL nativeScaleBy(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jdouble ds, jdouble cx,

View File

@@ -1428,8 +1428,13 @@ mbgl::Duration MGLDurationInSeconds(NSTimeInterval duration)
CGFloat slowdown = 20.0;
CGFloat pitchNew = currentPitch - (gestureDistance / slowdown);
_mbglMap->setPitch(pitchNew);
CGPoint centerPoint = self.contentCenter;
if (self.userTrackingMode != MGLUserTrackingModeNone)
{
centerPoint = self.userLocationAnnotationViewCenter;
}
_mbglMap->setPitch(pitchNew, centerPoint);
[self notifyMapChange:mbgl::MapChangeRegionIsChanging];
}

View File

@@ -1207,7 +1207,7 @@ public:
[self didChangeValueForKey:@"direction"];
}
if (self.pitchEnabled) {
_mbglMap->setPitch(_pitchAtBeginningOfGesture + delta.y / 5);
_mbglMap->setPitch(_pitchAtBeginningOfGesture + delta.y / 5, center);
}
}
} else if (self.scrollEnabled) {

View File

@@ -357,7 +357,11 @@ void Map::resetNorth(const Duration& duration) {
#pragma mark - Pitch
void Map::setPitch(double pitch, const Duration& duration) {
transform->setPitch(pitch * M_PI / 180, duration);
setPitch(pitch, {NAN, NAN}, duration);
}
void Map::setPitch(double pitch, const PrecisionPoint& anchor, const Duration& duration) {
transform->setPitch(pitch * M_PI / 180, anchor, duration);
update(Update::Repaint);
}

View File

@@ -523,12 +523,17 @@ double Transform::getAngle() const {
#pragma mark - Pitch
void Transform::setPitch(double pitch, const Duration& duration) {
setPitch(pitch, {NAN, NAN}, duration);
}
void Transform::setPitch(double pitch, const PrecisionPoint& anchor, const Duration& duration) {
if (std::isnan(pitch)) {
return;
}
CameraOptions camera;
camera.pitch = pitch;
camera.anchor = anchor;
easeTo(camera, duration);
}

View File

@@ -102,7 +102,15 @@ public:
double getAngle() const;
// Pitch
/** Sets the pitch angle.
@param angle The new pitch angle, measured in radians toward the
horizon. */
void setPitch(double pitch, const Duration& = Duration::zero());
/** Sets the pitch angle, keeping the given point fixed within the view.
@param angle The new pitch angle, measured in radians toward the
horizon.
@param anchor A point relative to the top-left corner of the view. */
void setPitch(double pitch, const PrecisionPoint& anchor, const Duration& = Duration::zero());
double getPitch() const;
// North Orientation