使用核心动画和块旋转 UIView 对象的问题

Posted

技术标签:

【中文标题】使用核心动画和块旋转 UIView 对象的问题【英文标题】:Issue rotating a UIView object using Core Animation and blocks 【发布时间】:2011-08-30 20:29:14 【问题描述】:

我在使用 Core Animation 旋转 UIView 子类对象以响应 UISwipeGesture 时遇到问题。

描述上下文:我有一个圆形表盘,我用 CG 绘制并作为子视图添加到主视图中。 为了响应滑动手势,我指示它在任一方向上旋转 15 度,具体取决于它是向左还是向右滑动。

单向只能旋转一次的问题。识别出后续手势(从触发的其他动作中可以看出)但动画不会重复。我可以向左走一次,然后向右走一次。但是尝试多次朝任一方向前进是行不通的。这是相关代码,让我知道你的想法......

- (IBAction)handleLeftSwipe:(UISwipeGestureRecognizer *)sender 

    if ([control1 pointInside:[sender locationInView:control1] withEvent:nil]) 
    
    //updates the display value
    testDisplay.displayValue = testDisplay.displayValue + 0.1;
    [testDisplay setNeedsDisplay];

    //rotates the dial
    [UIView animateWithDuration:0.25 animations:^
        CGAffineTransform  xform = CGAffineTransformMakeRotation(radians(+15));
        control1.transform = xform;
        [control1 setNeedsDisplay];
    ];
 

【问题讨论】:

我将研究下面的答案,但只是为了使事情进一步复杂化...... UIView 表盘有阴影。旋转视图也会旋转阴影。我想我需要一种方法将 CTM(变换矩阵)上的位置恢复 15 度并重新绘制它以避免阴影问题?我不知道如何在视图的 drawRect 方法之外设置更改 CTM。我无法在视图控制器中引用视图的图形上下文。我认为。我可能是错的...... 所以你想旋转表盘而不是阴影?表盘和影子在同一个视图中吗? 对这两个问题都是肯定的。我可以在带有阴影的表盘下方放置另一个视图,以便除了阴影之外它被隐藏,并使用我们讨论过的计数器方法。只是我不敢相信没有办法重置变换矩阵。我浏览过文档,但看不到任何东西。也许这只是我需要接受的东西。 这是一种解决方法,不过您可能会对此感兴趣。 ***.com/questions/469505/… 这是一个有趣的话题。我担心的是他们讨论了 CGGetContext,我只能从视图的 drawRect 方法内部进行。我需要从主视图控制器执行此操作。嗯……我要睡了。 【参考方案1】:

CGAffineTransform xform = CGAffineTransformMakeRotation(弧度(+15));

您是否记录了旋转的总距离。 CGAffineTransformMakeRotation 不是附加的。仅使用最新的。因此,您每次将其设置为 15,而不是每次都设置为 15。

【讨论】:

进一步:虽然通过control1.transform 属性读取旋转很吸引人(例如通过CGAffineTransformRotate 隐式读取),但随着时间的推移存在舍入错误累积的风险。所以最好将角度作为实例变量跟踪并继续使用CGAffineTransformMakeRotation 啊,所以你的意思是每次我触发一个旋转增量一个计数器并旋转 15 * 计数器? 这将是解决问题的一种方法。没问题。 我遇到了问题,请参阅上面对原始帖子的评论...想法?【参考方案2】:

这是一个累积旋转视图的超级简单示例。每按一次按钮,视图就会旋转 180 度。

    - (IBAction) onRotateMyView: (id) sender
    

     [UIView animateWithDuration:0.3 animations:^
          myView.transform = CGAffineTransformMakeRotation(M_PI/2*rotationCounter);
      completion:^(BOOL finished)
        //No nothing
     ];

     ++rotationCounter;

【讨论】:

以上是关于使用核心动画和块旋转 UIView 对象的问题的主要内容,如果未能解决你的问题,请参考以下文章

UIView:旋转+移动

UIView 动画,它们是不是使用“核心动画”

核心动画与UIView

ios开发核心动画七:核心动画与UIView动画的区别

核心动画——Core Animation

核心动画——Core Animation