[英]Rotate UIView based on UITouch
我正在开发绘图应用程序。
我希望用户能够在屏幕上“放置”一个形状,然后根据需要移动,调整大小或旋转它。
问题出在旋转上。 我的搬动和调整大小工作正常。
之前,我是通过一个相当复杂且需要大量内存/处理器的过程来完成此任务的,现在我正在尝试改进这一过程。
我已经搜索了,但是没有找到与我尝试的类似的答案。
基本上,假设用户在“表面”上放置了一个正方形。 然后,他们点击它并得到一些手柄。 他们可以触摸任意位置并平移以移动正方形(已工作),触摸并拖动其大小调整手柄以调整正方形(已工作),或抓住旋转手柄以使正方形围绕其中心旋转。
我已经研究过使用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 Keynote似乎可以使用UIGestureRecognizers完成此操作,因为您必须使用两个手指来旋转添加的形状。 这是要走的路吗?
思考?
谢谢!
-(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];
}
这可能会有所帮助。
只需简单的旋转,您就可以省略动画:
-(void)rotate:(CGFloat)angle
{
CGAffineTransform transform = CGAffineTransformRotate( myView.transform, angle * M_PI / 180.0 );
myView.transform = transform;
}
我使用一个简单的NSTimer来控制动画。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.