views:

240

answers:

1

I'm having troubles getting any UIView that's not the foreground UIView to receive UITouch events. I'm building an all-Core Graphics-app, so I'm not using any built in UIViews or IB or anything - everything is programmatically constructed and drawn into.

Here's my view hierarchy:

  • Root View
    • Type A Container
      • Type A View
      • Type A View
      • Type A View
    • Type B Container
      • Type B View
      • Type B View
      • Type B View

The containers are just vanilla UIView objects that I create programmatically and add instances of Type A and B to when they're created. I did this originally to make hitTesting easier—Type A objects can be drag-and-dropped onto Type B objects. Type A objects receive touch events fine, but Type B objects (which are contained by Type B Container which is behind Type A Container) don't receive touch events. Both containers occupy the entire screen; they're basically just convenience containers.

If I pull Type B Container to the front (eg [self.view bringSubviewToFront:Type B Container]) it receives events properly, but then the Type A Container doesn't get events.

How do I propagate events from the view that's on top? Both views occupy the entire screen, so it makes sense that the top-most view is catching the events, but how should I get it to pass those events on to Type B Container? I could inject some code in the container that passes the touch events back to the main ViewController which can pass them on to Type B Container but that feels really messy to me. Is there a nicer way to not have the Type A Container stop propagation? What's the best practice here?

A: 

Did you ever solve this issue? I've got the exact same problem ATM.

d2kagw
I didn't, really… Because of the details of my setup, I discovered I could just dissolve one of the containers and put all the views from that container at the root level. It's not pretty, but it works. I still don't have a nicer solution.
drewww