1

我正在开发一个 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以便立方体边缘在它在屏幕上平移时跟踪手指运动?

4

1 回答 1

1

这里有两个问题:

  1. 这里的主要性能问题是此类执行立方体侧面变换的方式。它给立方体的每一面一个复杂的变换,然后当你拖动立方体时,它会占用立方体的相关边,将它们添加到 a CATransformLayer,并在该层上执行一个复杂的变换(因此,当你看在立方体的各个侧面,您正在对变换进行变换)。

    我提取了那个CATransformLayer逻辑,并更新了各个方面的转换,它的响应速度大大提高了。

    顺便说一句,当您为旋转立方体的释放设置动画时,您可能仍希望使用类似这种CATransformLayer逻辑的东西,因为这是同步立方体各个侧面的动画的绝佳方式(否则您会在动画期间立方体的侧面)。但是在拖动时,性能受到了太多影响。

    随着您继续完善这一点,可能还有其他优化可以完成,但我的测试表明,摆脱对复杂转换的转换会对性能产生巨大影响。

    顺便说一句,请确保在设备上而不是模拟器上进行测试,因为模拟器的图形性能与设备的图形性能有很大不同。

  2. 可能会导致响应速度出现轻微初始延迟的一个次要因素可能是固有延迟UIPanGestureRecognizer(在将手势识别为平移之前寻找一定量的移动,以便在适当的情况下触发其他手势,例如轻敲等) . 这是一个适度的延迟,只是性能问题的一小部分,但为了获得最快的响应时间,您可能不想使用UIPanGestureRecognizer. 无论是您自己的子类,还是使用 aUILongPressGestureRecognizer和 a minimumPressDuration0.0您都可以获得对手势的即时响应。

    您会看到它对运动的响应更快(但它也是一种与其他人不兼容的手势,如果您在视图中有点击手势或类似的手势,它们将不会被触发)。

于 2013-07-17T15:46:14.020 回答