家长回应孩子的触摸

时间:2009-12-30 17:56:06

标签: iphone cocoa-touch uiviewcontroller uiimageview

我有一个带有子类UIImageViews的UIScrollView。单击其中一个图像视图时,我希望父UIView(包含scrollview)在其中接收事件

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

我可以判断图像视图是否被

点击了
if(CGRectContainsPoint(myScrollView.frame, location) == YES){...}

假设imageview和scrollview的大小相同。或者是否有更好的方法来了解滚动视图中的特定图像视图?图像视图是动态创建的。

3 个答案:

答案 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];
    // ...
}