图像上的触摸事件,通过使用 UIButton 实现,但与 UIImageView 相比显示延迟

Posted

技术标签:

【中文标题】图像上的触摸事件,通过使用 UIButton 实现,但与 UIImageView 相比显示延迟【英文标题】:Touch Event on image , achieved by using UIButton but show up delayed compare to UIImageView 【发布时间】:2011-03-31 15:57:00 【问题描述】:

抱歉标题乱七八糟,我只是不知道如何巧妙地描述问题。

我正在编写一个类似专辑的应用程序,以在我的滚动视图中显示一堆图像,并在触摸图像时执行一些操作。

我关注了这个问题:how can i detect the touch event of an UIImageView 并使用带有背景图像的按钮来处理触摸事件。

我的原始方法是使用 NSOperation 同时从互联网上获取图像并将其放入一个 imageview 并添加到我的滚动视图中,速度还可以,因为每个 imageview 在每个 NSOperation 回调之后立即显示。

然后我将 imageview 更改为 uibutton,奇怪的是当 NSOperation 回调时,该按钮不会显示在我的视图中。当所有 NSOperation 回调完成时,它们会立即出现。这会让用户体验变得无法接受。

这是我的 NSOperation 回调函数,它将传递一个包含从互联网获取的图像的按钮

- (void)imageLoaded:(UIButton*)button;

    NSLog(@"Done");
    [button addTarget:self action:@selector(buttonPressed:) 
     forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];

按钮只会在最后一个“完成”出现后才会显示,而不是一个一个出现,这正常吗?还是我搞砸了什么?

==== 更新========

我想我正在我的视图控制器上运行 NSOperation。我有一个 imageLoadOperation 类,我会将我的视图控制器传递给它

imageLoadOperation *ilo = [[imageLoadOperation alloc] initWithURLString:[NSString stringWithFormat:@"link for the image"];
[ilo setParent:self];
[queue addOperation:ilo];
[ilo release];

而在 imageLoadOperation 的主函数中我会这样做

[parentViewController performSelectorOnMainThread:@selector(imageLoaded:) withObject:button waitUntilDone:NO];

您的意思是我需要将这些代码移动到我的 AppDelegate 而不是在我的视图控制器中运行吗?

【问题讨论】:

猜测你必须在主线程中做这些事情 -> 可能是从你的 imageLoaded 调用的方法 performSelectorOnMainThread 直到是对的,您需要从主线程中完成这项工作。 UIImageView 可能有效,但这只是实现的一个问题。 感谢回复,我已经更新了我的NSOperation的代码,你的意思是我应该把它移到我的AppDelegate而不是viewcontroller? 【参考方案1】:

您可以在图像视图上使用自定义类型的按钮,而不是使用带有背景图像的按钮,或者您可以在 UIImageView 上使用触摸事件

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

【讨论】:

您好,感谢您的回复,我按照您的建议添加了一个图像视图和一个自定义类型的不透明按钮,现在它工作得很好。再次感谢!【参考方案2】:

如果您只允许 UIImageView 处理触摸事件而不是转换为按钮怎么办?

要向 UIImageView 添加触摸事件,请在 .m 中使用以下格式

UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(newTapMethod)];

[_imageButtonName setUserInteractionEnabled:YES];

[_imageButtonName addGestureRecognizer:newTap];

然后创建 newTapMethod(或任何你命名的方法)

-(void)newTapMethod
//...

希望有帮助。

【讨论】:

以上是关于图像上的触摸事件,通过使用 UIButton 实现,但与 UIImageView 相比显示延迟的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UIButton 上的 UIImageView 会在触摸时重新出现?

uiscrollview 和 uibutton 对触摸事件透明

UIButton ImageView 在 iCarousel 中占用更多空间并且不响应触摸事件

混合图层图像Android上的触摸事件

图像视图没有响应触摸事件

在 UIButton 上实现触摸取消