我正在制作一个绘图应用。
我希望用户能够在屏幕上“放下”一个形状,然后根据需要移动,调整大小或旋转它。
问题在于轮换。我有移动和调整大小的工作正常。
我之前使用了一个相当复杂的内存/处理器密集型流程,我现在正在努力改进它。
我进行了搜索和搜索,但没有找到类似于我正在尝试的答案。
基本上,假设用户在“表面”上放置一个正方形。然后,他们点击它并获得一些手柄。它们可以触摸任何地方并平移以移动方块(已经工作),触摸并拖动调整大小手柄以调整方块的大小(已经工作),或抓住旋转手柄使方块围绕其中心旋转。
我已经研究过使用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似乎可以实现这一目标,因为您必须使用两个手指来旋转添加的形状。这是要走的路吗?
思想?
谢谢!
答案 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来控制动画。