基于UITouch旋转UIView

时间:2010-10-16 12:44:42

标签: uiview ios rotation uigesturerecognizer

我正在制作一个绘图应用。

我希望用户能够在屏幕上“放下”一个形状,然后根据需要移动,调整大小或旋转它。

问题在于轮换。我有移动和调整大小的工作正常。

我之前使用了一个相当复杂的内存/处理器密集型流程,我现在正在努力改进它。

我进行了搜索和搜索,但没有找到类似于我正在尝试的答案。

基本上,假设用户在“表面”上放置一个正方形。然后,他们点击它并获得一些手柄。它们可以触摸任何地方并平移以移动方块(已经工作),触摸并拖动调整大小手柄以调整方块的大小(已经工作),或抓住旋转手柄使方块围绕其中心旋转。

我已经研究过使用UIBezierPath绘制正方形,或者只是让它成为我填充的UIView的子类。

在任何一种情况下,我都试图旋转UIView本身,而不是内部的一些内容。每当我尝试旋转视图时,要么没有任何反应,视图会腾出屏幕,或者它会稍微旋转并停止。

以下是我尝试过的一些代码(这不起作用,我尝试了很多不同的方法):

- (void) rotateByAngle:(CGFloat)angle
{

CGPoint cntr = [self center];

CGAffineTransform move  = CGAffineTransformMakeTranslation(-1 * cntr.x, -1 * cntr.y);
[[self path] applyTransform:move];

CGAffineTransform rotate = CGAffineTransformMakeRotation(angle * M_PI / 180.0);
[[self path] applyTransform:rotate];

[self setNeedsDisplay];
CGAffineTransform moveback = CGAffineTransformMakeTranslation(cntr.x, cntr.y);
[[self path] applyTransform:moveback];

}

如果不明显,想到这里将视图移动到原点(0,0),围绕该点旋转然后将其移回。

如果您想知道,“角度”是正确计算的。我还将上面的代码包装在[UIView beginAnimations:nil context:NULL] / [UIView commitAnimations]块中。

是否可以将UIView旋转为“自定义”金额?我已经看到/在我为控件旋转设置之前完成它,但在这些示例中,控件总是以“方形”结束(即,它旋转了一个或多个完整的圆圈并返回到它的起始方向)。

是否可以“实时”执行此轮换以响应UITouches?我是否需要将方块绘制为UIView图层中的项目并改为旋转图层?

就是你知道,我以前工作的是一组由一组线条或UIBezierPaths绘制的形状。我将CGAffineTransform应用于数据,然后调用drawRect:方法,该方法将重新绘制自定义UIView内的对象。这个UIView将承载相当多的这些项目,所有这些项目都需要在其中一个需要的时候重新绘制。

所以,我试图通过创建一堆UIView子类来使应用程序更高效,当用户对它们执行某些操作时,它只会获得重新绘制的命令。 Apple的iPad主题演示使用UIGestureRecognizers似乎可以实现这一目标,因为您必须使用两个手指来旋转添加的形状。这是要走的路吗?

思想?

谢谢!

2 个答案:

答案 0 :(得分:4)

-(void)rotate{
    CGAffineTransform transform;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationCurve:UIViewAnimationOptionBeginFromCurrentState];
    myView.alpha = 1;
    transform = CGAffineTransformRotate(myView.transform,0.5*M_PI);
    [myView setUserInteractionEnabled:YES];
    myView.transform = transform;
    [UIView commitAnimations];
}

这可能会有所帮助。

答案 1 :(得分:1)

只需简单的旋转就可以省略动画:

-(void)rotate:(CGFloat)angle
{
    CGAffineTransform  transform = CGAffineTransformRotate( myView.transform, angle * M_PI / 180.0 );
    myView.transform = transform;
}

我使用简单的NSTimer来控制动画。