我正在开发一个 iPhone 应用程序,其中主要视图在立方体的表面上呈现给用户。用户通过使用平移手势旋转立方体来切换视图。
为了实现这一点,我使用了这个 GitHub 项目中的 GKLCubeController 类。
在向立方体添加视图和旋转方面,它工作得很好。然而,当立方体在屏幕上平移时,立方体的角度旋转并没有正确映射到x
手指的当前位置。
问题是立方体旋转滞后于手指移动约 ½ 秒,这使得立方体感觉“沉重”,如这个简短的截屏视频所示。
处理旋转的代码如下所示:
-(void)panHandler:(UIPanGestureRecognizer*)panner{
CGPoint translatedPoint = [panner translationInView:self.view.window];
CGFloat halfWidth = self.view.bounds.size.width / 2.0;
// save our starting points
if([panner state] == UIGestureRecognizerStateBegan) {
startingX = translatedPoint.x;
if (!transformLayer) {
transformLayer = [[CATransformLayer alloc] init];
transformLayer.frame = self.view.layer.bounds;
for (UIView *viewToTranslate in views) {
[viewToTranslate removeFromSuperview];
[transformLayer addSublayer:viewToTranslate.layer];
}
// add in this new layer
[self.view.layer addSublayer:transformLayer];
}
} else if([panner state] == UIGestureRecognizerStateEnded) {
...
} else {
// instantly adjust our transformation layer
CATransform3D transform = CATransform3DIdentity;
transform.m34 = kPerspective;
double percentageOfWidth = (translatedPoint.x - startingX) / self.view.frame.size.width;
transform = CATransform3DTranslate(transform, 0, 0, -halfWidth);
double adjustmentAngle = percentageOfWidth * M_PI_2 + startingAngle;
transform = CATransform3DRotate(transform, adjustmentAngle, 0, 1, 0);
transform = CATransform3DTranslate(transform, 0, 0, halfWidth);
transformLayer.transform = transform;
finishingAngle = adjustmentAngle;
}
}
我怀疑问题与将CGPoint.x
返回的转换为UIPanGestureRecognizer translationInView:
旋转角度有关。任何人都可以确认是否是这种情况,并建议将触摸位置映射到立方体的旋转的正确数学应该是什么,x
以便立方体边缘在它在屏幕上平移时跟踪手指运动?