[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:
committed by
Minh Nguyễn
parent
97fc2120c4
commit
8a23bdcd01
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user