1

我有一个UIView实例,我正在使用CAKeyframeAnimation. 这是一个循环动画,将不断运动。但是,我需要允许用户与该项目进行交互(准确地说是响应点击)。因为 CoreAnimation 只移动表示层而不是模型,所以我不能使用UIButton实例来获取touchUpInside事件。

考虑以下基本示例布局:

在此处输入图像描述

我通过覆盖子类touchesEnded:withEvent:上的方法将蓝色框用于触摸事件UIView。然后我通过一个NSNotification(我真的不想引入很多耦合来处理这个事件)将该事件冒泡到包含的视图控制器,然后hitTest:在红色框上进行动画处理。

所有这一切似乎都很难触摸动画UIView处理动画/实例触摸的最佳模式是什么?UIViewCALayer

4

2 回答 2

1

我相信在超级视图中跟踪触摸是正确的。但我会在超级视图中进行命中测试,而不是向视图控制器发布通知。像这样的东西:

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

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

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

MYAnimationContainerView中,同时覆盖touchesBegan:withEvent:touchesEnded:withEvent:。在began中,对移动视图的表示层执行命中测试。跟踪哪一个(如果有的话)被触摸了。在ended中,执行另一个命中测试。如果是相同的视图,则调用您的回调。

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

您也可以使用目标/选择器来实现它,但是这种模式对ARC 来说有点麻烦,我现在倾向于不鼓励使用它。

于 2012-02-16T15:15:14.517 回答
0

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

在许多此类对象的情况下,触摸事件由其自身处理。

我不确定这是你所期望的。

于 2012-02-16T05:52:34.547 回答