2012-02-16 102 views
1

我有一个UIView实例,我正在使用CAKeyframeAnimation进行动画处理。这是一个循环动画,并将不断运动。但是,我需要允许用户与物品进行互动(确切地说,响应点击)。由于CoreAnimation仅移动表示层而不移动模型,因此我无法使用UIButton实例来获取touchUpInside事件。处理动画UIView/CALayer触摸的最佳模式?

考虑以下基本示例布局:

enter image description here

我使用了触摸事件的蓝色框通过重写touchesEnded:withEvent:方法上UIView子类。然后,我通过NSNotification(我真的不想引入很多耦合来处理此事件)将该事件冒泡给包含的视图控制器,然后在红色框中执行hitTest:动画。

所有这一切似乎都相当冒险,只能触摸动画UIView处理动画UIView/CALayer实例触摸的最佳模式是什么?

+0

您是否需要使用CA? CA对于流畅的动画来说是最好的选择,因为它非常轻便,而且轻量级,因为它没有全部的事件处理功能(部分属实)。如果你以某种方式向它添加事件处理,那么你可能会破坏平滑的GPU能力。我不确定有没有办法解决这个问题。它需要多么流畅?你可能想用其他一些动画技术来动画,这些动画技术实际上是用CPU来移动模型的。只是想和你大声说话。 – Vinnie 2012-02-16 05:09:54

+0

@Vinnie - 问题是这个例子是一个非常简单的动画。真正的问题实际上涉及若干关键帧,以便沿着路径对视图进行动画处理,并在沿路径移动时进行一些旋转。动画也需要重复ad-infinitum,所以使用基于UIView块实际上看起来不太合适。 – 2012-02-16 05:30:58

回答

1

追踪superview中的触摸是正确的,我相信。但是我会在超视图中进行测试,而不是向视图控制器发布通知。类似这样的:

创建一个MYAnimationContainerView类(蓝色框)。

给它一个拥有视图控制器设置的委托或阻止回调。例如:

__weak id weakSelf = self; 
MYAnimationContainerView *view = [[MYAnimationContainerView alloc] initWithTouchCallback:^(UIView *touchedView){ 
    [weakSelf handleTouchToView:touchedView]; 
}]; 

MYAnimationContainerView,同时覆盖touchesBegan:withEvent:touchesEnded:withEvent:。在began中,对移动视图的表示层执行命中测试。跟踪哪一个(如果有)被触摸。在ended中,执行另一次命中测试。如果它是相同的看法,然后打电话给你的回调。

上述可以很容易地用delegate协议而不是一个块来实现。我刚刚养成了比单方法委托协议更喜欢块的习惯。

你也可以使用目标/选择器来实现它,但是该模式已经变成a bit of a hassle with ARC,我倾向于阻止它在今天的使用。

+0

我更喜欢你的方法。谢谢! – 2012-02-17 02:17:46

0

如果您想要处理视图中特定对象的触摸,请说出蓝色的红色框,最好创建一个单独的类,比如UIview的子类,并处理其中的触摸事件。它干净而抽象。

如果有很多这样的对象,触摸事件是由它自己处理的。

我不确定这是您的预期。

+0

触摸不是由它们自己处理的,这是因为只有表示层是动画的,而不是模型层,触摸处理。 – 2012-02-16 13:35:47