代码之家  ›  专栏  ›  技术社区  ›  mbm29414

基于UITouch旋转UIView

  •  2
  • mbm29414  · 技术社区  · 15 年前

    我正在开发一个绘图应用程序。

    问题在于旋转。我的移动和大小调整工作良好。

    我以前用的是一个相当复杂的、内存/处理器密集型的过程,现在我正在尝试改进。

    我找了又找,但没有找到一个和我想做的相似的答案。

    基本上,假设用户在“曲面”上放置了一个正方形。然后,他们敲打它,并得到一些处理。它们可以触摸任何位置并平移以移动正方形(已工作),触摸并拖动调整大小手柄以调整正方形大小(已工作),或抓住旋转手柄以使正方形围绕其中心旋转。

    我已经研究过使用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] 封锁。

    是否可以执行这种旋转“实时”响应uitouchs?我需要在UIView的图层中将正方形作为一个项目绘制并旋转图层吗?

    你知道吗,我以前做的是用一组线画出一个形状 UIBezierPaths . 我会申请 CGAffineTransform 然后调用drawRect:方法,该方法将在自定义UIView中重新绘制对象。这个UIView将包含相当多的这些项,所有这些项都需要在其中一个项需要时重新绘制。

    思想?

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  4
  •   sth    15 年前
    -(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];
    }
    

    这可能会有帮助。

        2
  •  1
  •   jankoen    14 年前

    对于简单的旋转,可以忽略动画:

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

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

    推荐文章