UIRotationGestureRecognizer - 围绕锚点旋转

时间:2012-08-20 05:42:06

标签: ios uiview uigesturerecognizer gesture-recognition

以下是我当前对手势识别器的实现:

- (IBAction)handleRotate:(UIRotationGestureRecognizer *)recognizer {

if([recognizer state] == UIGestureRecognizerStateEnded) {

    _lastRotation = 0.0;
    return;
}

CGFloat rotation = 0.0 - (_lastRotation - [recognizer rotation]);

CGAffineTransform currentTransform = self.container.transform;
CGAffineTransform newTransform = CGAffineTransformRotate(currentTransform,rotation);

[self.container setTransform:newTransform];

_lastRotation = [recognizer rotation];

}

工作正常。问题是self.container总是围绕它的中心旋转。我希望它围绕两个触摸的中点旋转,这样如果你放大了,你可以围绕你正在触摸的区域旋转。我该怎么做?

2 个答案:

答案 0 :(得分:0)

我不确定你是否可以将一个点设置在被旋转对象的边界之外,但是你的容器图层属性将允许你从变换中指定一个锚点。

它接受从左上角到右下角0.0-1.0的值。

#import <QuartzCore/QuartzCore.h>

[[container layer] setAnchorPoint:myCGPoint];

答案 1 :(得分:0)

您可以使用代码

将中心点放置到任何CGPoint类型变量
recognizer.view.center = CGPoint(x,y);

有关详细说明,请参阅this示例

(在pangesturerecognizer handeling方法中,它显示了如何设置视图中心)

快乐编码:)

编辑1

好的,我得到了如何在视图(任意)中获取触摸位置的代码,因为第一个必需的是为视图启用多重触摸属性。 (见下图)

multipal touch enabled in XIB

然后实现委托方法如下

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Began %@",touches);
    NSUInteger touchCount = 0;
    for(UITouch *tu in touches)
    {
        CGPoint pt = [tu locationInView:self.view];
        NSLog(@"pt %f, %f",pt.x,pt.y);
        touchCount ++;
    }
    NSLog(@"touchCount %d",touchCount);
}

此方法显示NSLog中的触摸。我只使用self.view进行演示,您可以使用任何视图。

根据您的要求修改此方法,并使用以下计算使用两点坐标获取中心点

p3.x =(p1.x + p2.x)/ 2; p3.y =(p1.y + p2.y)/ 2;

这里p1,p2是你在上面提到的委托方法中得到的两个接触点,p3是你需要的中心点。

快乐编码:)