我有一个带有子类UIImageViews的UIScrollView。单击其中一个图像视图时,我希望父UIView(包含scrollview)在其中接收事件
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
我可以判断图像视图是否被
点击了if(CGRectContainsPoint(myScrollView.frame, location) == YES){...}
假设imageview和scrollview的大小相同。或者是否有更好的方法来了解滚动视图中的特定图像视图?图像视图是动态创建的。
答案 0 :(得分:3)
我过去使用的方法是在触摸子视图时触发通知,子视图作为通知发布的对象。然后,您可以让容器视图侦听相应的通知,并根据所选的UIView实例执行所需的任何操作。
您可以在子视图的-touchesEnded:withEvent:
方法中发布通知,如下所示:
[[NSNotificationCenter defaultCenter] postNotificationName:@"MySubviewWasTouched" object:self];
要设置侦听此通知,您可以在视图初始化或视图控制器中放置如下代码:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleSubviewTouch:) name:@"MySubviewWasTouched" object:nil];
记住要删除视图或控制器的拆解代码中的观察者。
最后,您需要实施处理通知接收的方法(上例中的-handleSubviewTouch:
):
- (void)handleSubviewTouch:(NSNotification *)note;
{
UIView *subviewThatWasTouched = [note object];
// Your touch-handling logic here
}
答案 1 :(得分:2)
请注意,默认情况下,UIImageView
会忽略触摸(或者更确切地说,让它们传递到其超级视图)。确保将图像视图的“userInteractionEnabled
属性设置为”。
答案 2 :(得分:0)
如果图像视图没有任何子视图,则可以使用UIView方法hitTest:withEvent:
。它返回包含给定触摸点的UIView的最远后代。例如:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
CGPoint location = [[touches anyObject] locationInView:myScrollView];
UIView *touchedView = [myScrollView hitTest:location withEvent:event];
// ...
}