使用核心动画和块旋转 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 对象的问题的主要内容,如果未能解决你的问题,请参考以下文章