2010-10-16 83 views
2

我正在绘制应用程序。基于UITouch旋转UIView

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

问题在于旋转。我有移动和调整大小工作正常。

我之前是用一个相当复杂的内存/处理器密集型过程来完成这项工作的,现在我正试图改进它。

我已经搜索和搜索,但还没有找到类似于我想要做的答案。

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

我已经看过使用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“自定义”金额?我已经看过/完成过之前让动画旋转的控件,但在这些示例中,控件始终以“方形”结束(即旋转了1个或更多个整圆并返回其开始方向)。

是否有可能为了响应UITouches而“实时”执行此轮换?我是否需要在UIView的图层中绘制正方形作为一个项目,然后旋转图层?

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

因此,我试图通过创建一堆UIView子类来使应用更具性能,当用户用它们做某些事情时,它只会得到一个重新绘制的命令。 Apple的iPad主题演讲似乎使用UIGestureRecognizers实现了这一点,因为您必须使用两个手指来旋转添加的形状。这是要走的路吗?

想法?

谢谢!

+0

Apple的示例应用程序[Touches_GestureRecognizers](http://developer.apple.com/library/ios/#samplecode/Touches/Introduction/Intro.html)(不是Touches_Classic)显示了如何使用Pan,Pinch和Rotation手势识别器可以轻松完成这一切。 – Anna 2010-10-16 13:27:05

+0

是的......我发现发布后约10分钟。我在大约6个小时的搜索后发布了这个消息。抱歉。 – mbm29414 2010-10-16 14:03:03

回答

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

只是简单的旋转,你可能会离开了动画:

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

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