通过循环将 TouchUpInside 事件分配给多个 UIImageView,并使用可以进一步动画/操作每个 UIImageView 的处理程序方法

Posted

技术标签:

【中文标题】通过循环将 TouchUpInside 事件分配给多个 UIImageView,并使用可以进一步动画/操作每个 UIImageView 的处理程序方法【英文标题】:Assign a TouchUpInside event to several UIImageViews via a loop, with a handler method that can further animate/manipulate each UIImageView 【发布时间】:2011-08-08 17:49:28 【问题描述】:

我已经遍历了一个 NSArray 的 NSDictionary 对象,其中包含要显示的几个图像的数据。然后将此数据转换为 UIImageView 对象并作为子视图添加到当前视图。够简单!通过array/dict传入的所有图像都根据需要显示在屏幕上,到目前为止效果很好:

for (NSDictionary *caseData in caseImages)  // caseImages is the array
    UIImage *caseImage = [UIImage imageNamed:[caseData objectForKey:@"image_file"]];
    UIImageView *caseView = [[UIImageView alloc] initWithImage:caseImage];
    caseView.frame = CGRectMake([[caseData objectForKey:@"position_x"] intValue], [[caseData objectForKey:@"position_y"] intValue], [[caseData objectForKey:@"size_w"] intValue], [[caseData objectForKey:@"size_h"] intValue]);
    [self.view addSubview:caseView ];

但是,现在我需要更进一步,并实现一个 touchUpInside 事件处理程序,如果可能的话,它可以附加到每个 UIImageView 对象,这样处理程序方法可以进一步动画/操作每个 UIImageView,理想情况下,将触摸的图像居中并放大,并简单地将其余图像淡出。

我遇到的问题是如何成功添加触摸事件,并能够引用被触摸的图像以及其余未触摸的图像(如果可能),然后将适当的过渡动画应用于每个事件分别是图片。

我见过类似于下面 sn-p 的示例,但我无法让它工作:

[caseView addTarget:self action:@selector(spotlightCase) forControlEvents:UIControlEventTouchUpInside];

虽然,如果我真的让它工作,我仍然对如何成功引用从循环创建的每个 UIImageView 感到有点茫然,所以每个图像都可以根据哪个正确动画/操作一个确实被感动了。我是否需要在视图控制器中添加一个新的数组属性来保存添加到视图中的每个 UIImageView 对象的指针?使用 UIImageViews 甚至无法实现这些吗?我看到有人提到使用自定义 UIButton 对象,但我认为这可能同样复杂/不可能,因为我还需要为图像的大小和位置设置动画。

您是否有机会了解如何实施上述所有棘手的工作?

谢谢!

【问题讨论】:

【参考方案1】:

一种方法是为每个图像添加一个 UIButton 到视图控制器的视图中,并将 backgroundImage 属性设置为循环内的[UIImage imageNamed:]。您可以像在第二个 sn-p 中一样为每个按钮的目标设置一个通用选择器。我之前使用过类似的技巧,并设置了按钮的 tag 属性来识别被按下的按钮的索引。如果您还在 @selector(spotlightCase:) 的末尾添加一个冒号,您的方法也将传递调用它的对象的 id。您的方法定义是:

- (void) spotlightCase:(id) sender;

您可以在这里使用sender.tag 来控制您的逻辑。

希望对你有帮助

戴夫

【讨论】:

谢谢戴夫,非常有用的信息。如果我要走这条路,那么我是否会将所需的动画/操作应用于那些将被设置为 UIButton 对象的 backgroundImage 属性的 UIImage 对象? 那我将如何处理不被触摸的 UIImages/UIButtons 的褪色?我是否仍需要将每个 UIImage/UIButton 的引用存储在一个数组中,以便我可以在“spotlightCase”处理程序方法中再次循环它们?我想就动画/操作而言,我可能可以对它们做很多事情,只要我以某种方式在某处维护每个 UIImage/UIButton 的引用/指针。 是的,我会创建一个可变的 UIButton 数组,并在创建它们时将它们添加到数组中。在您的 SpotlightCase 方法中,您可以遍历数组,如果指向对象的指针与所触摸的对象(发送者)匹配,则执行一件事,如果不执行其他操作。希望这是有道理的,戴夫。 不错。好吧,我最终做了什么,因为我只想淡化其他 UIButtons,我只是创建了一个新的 UIImageView,其中包含用于触摸 UIButton 的图像,然后我将它添加到视图中,就在触摸 UIButton 的顶部,然后将我的动画应用到那个而不是按钮上。然后,在同一个动画块中,我添加了一个新的具有白色背景的 UIView,并将其从 0.0 的不透明度设置为 1.0,给人一种其他 UIButton 正在淡出的印象。工作一种享受!【参考方案2】:

尝试将值设置为 caseImage.tag 并使用它来识别已触摸的图像。

【讨论】:

以上是关于通过循环将 TouchUpInside 事件分配给多个 UIImageView,并使用可以进一步动画/操作每个 UIImageView 的处理程序方法的主要内容,如果未能解决你的问题,请参考以下文章

如何通过for循环将矩阵的值分配给数组

如何使用for循环将返回值分配给变量

touchUpInside 事件未触发

ASAuthorizationAppleIDButton 没有响应 touchUpInside 事件

UINavigationItem 上的 touchUpInside 事件

使用 IQKeyboardManager 关闭键盘以及触发按钮的 touchupinside 事件