【问题标题】:iPhone4 iOS5 UIRotationGestureRecognizer, how to remember rotation offset for subsequent rotations?iPhone 4 iOS 5 UItapGestureRecognizer,如何记住后续旋转的旋转偏移量?
【发布时间】:2011-11-28 16:20:36
【问题描述】:

我正在尝试使用UIRotationGestureRecognizer 在我的一个视图中创建类似旋钮的行为。这有效,并按预期定位视图。但是,每次执行手势时,识别器的旋转都会重置,因此旋钮每次都从 0 开始。

如何记住 UIRotationGestureRecognizer 的最后一次旋转,让用户调整旋钮 UIView 而无需每次都重置?

我正在尝试让识别器从视图的最后一次已知旋转开始计算旋转变化:

knob starts at 0, recognizer is at 0
recognizer is rotated to 45 degrees
recognizer stops rotating
the knob is left at 45 degrees //this is already happening with the provided code snippet

下一次接触:

//this is what's is happening
recognizer starts at 0, rotates the knob back to 0
//I want it to be:
recognizer starts at 45, rotates the knob as in the example above. 


- (IBAction)rotateView:(id)sender {

    if([sender isKindOfClass:[UIRotationGestureRecognizer class]])
    {
            UIRotationGestureRecognizer* recognizer = sender;

            CGAffineTransform transform = CGAffineTransformMakeRotation([recognizer rotation]);
            rotatingView.transform = transform;
    }

}

【问题讨论】:

    标签: iphone objective-c uiview ios5 uigesturerecognizer


    【解决方案1】:

    您应该能够从它的 transform 属性中获取当前旋转视图的旋转。当手势开始时,将此值存储到savedRotation 变量中。确保分配一个delegate 来处理gestureRecognizerShouldBegin 回调。

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)recognizer
    {
        savedRotation = atan2(rotatingView.transform.b, rotatingView.transform.a);
        return YES;
    }
    
    - (void)rotateView:(UIRotationGestureRecognizer*)recognizer
    {
        rotatingView.transform = CGAffineTransformMakeRotation(recognizer.rotation+savedRotation);
    }
    

    【讨论】:

    • 这是一件好事。如何将此旋转传递给识别器?视图确实以正确的旋转结束,但识别器每次都从旋转 offset0 开始。
    • 我的第一个答案并不清楚。我更新了答案以包含一个示例。
    【解决方案2】:

    变换变换:

    rotatingView.transform = CGAffineTransformRotate(rotatingView.transform, [recognizer rotation]);
    

    【讨论】:

    • 转换变换会导致视图疯狂旋转。这是一个有趣的效果,但不是我想要的。我的猜测是识别器以非常快速的顺序传递了太多事件,这种方法无法正常工作。
    【解决方案3】:

    您必须确保在转换后重置旋转。否则它们会相互叠加,你会得到“有趣”的行为。

    rotatingView.transform = CGAffineTransformScale(rotatingView.transform, recognizer.scale, recognizer.scale);
    [recognizer setRotation:0];   // this line
    

    对于在处理手势时可能进行的任何平移或缩放转换,您也应该这样做。方法有:

    [recognizer setScale:1];
    [recognizer setTranslation:CGPointZero inView:recognizer.view.superview];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 2014-04-13
      • 2011-12-20
      • 2014-01-24
      • 1970-01-01
      相关资源
      最近更新 更多