繁体   English   中英

基于UITouch旋转UIView

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM