【发布时间】:2013-07-20 05:46:12
【问题描述】:
我正在开发一个 iPhone 应用程序,其中主要视图在立方体的表面上呈现给用户。用户通过平移手势旋转立方体来切换视图。
为了实现这一点,我正在使用来自this GitHub project 的 GKLCubeController 类。
在向立方体添加视图和旋转方面,它工作正常。然而,立方体的角度旋转并没有正确映射到手指在屏幕上平移时的当前x 位置。
问题在于立方体旋转滞后于手指移动约 ½ 秒,这使得立方体感觉“沉重”,如 this short screencast 所示。
处理旋转的代码如下所示:
-(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;
}
}
我怀疑问题与将UIPanGestureRecognizer translationInView: 返回的CGPoint.x 转换为旋转角度有关。任何人都可以确认是否是这种情况,并建议将触摸位置x 映射到立方体的旋转的正确数学应该是什么,以便立方体边缘在它在屏幕上平移时跟踪手指运动?
【问题讨论】:
标签: ios objective-c cocoa 3d