On 10-Jun-2011, at 12:44 AM, Matt Neuburg wrote: > On Wed, 01 Jun 2011 22:25:32 +0800, Roland King <r...@rols.org> said: >> I've been taking advantage of the fact that UIView's don't clip to their >> bounds by making my superview of size CGSizeZero and adding content to it. >> This means I can position the whole view hierarchy using its center, which >> is always at (0,0). This is very useful as my view has subviews which move >> all over the place and I really only care about the top left, the superview >> is just a convenient canvas to hang them on. >> >> I got bitten by that today however because none of my subviews get touches, >> I believe that's because a touch outside the superview bounds is ignored, >> the views are shown, they aren't clipped, but the touches are 'clipped'. >> >> Is there method call to tell a view to hitTest: out of its own bounds, just >> considering the subviews? > > See chapter 18 of my book. Basically, your assessment is exactly right; all > you have to know is how hit-testing works. You touch outside your view, so as > the hit-test percolates down through the views it comes to your view and > asks: was this touch inside you? And your view says no, rightly, and that's > the end of that; we never get down to your view's subviews. > > So clearly all you have to do is modify hit-testing, which is easy: your view > must test its subviews even if the touch is outside itself. Something like > this, in your UIView (largely off the top of my head, but this should work to > get you started): > > -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { > UIView* result = [super hitTest:point withEvent:event]; > if (result) > return result; > for (UIView* sub in [self.subviews reverseObjectEnumerator]) { > CGPoint pt = [self convertPoint:point toView:sub]; > result = [sub hitTest:pt withEvent:event]; > if (result) > return result; > } > return nil; > } >
that's just about exactly what I ended up with .. thanks! -(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *retval = nil; // traverse the subviews in backwards order until one returns something for( UIView *subview in [ [ self subviews ] reverseObjectEnumerator ] ) if( ( retval = [ subview hitTest:[ subview convertPoint:point fromView:self ] withEvent:event ] ) ) break; return retval; } > m. > > -- > matt neuburg, phd = m...@tidbits.com, <http://www.apeth.net/matt/> > A fool + a tool + an autorelease pool = cool! > Programming iOS 4! > http://www.apeth.net/matt/default.html#iosbook _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com