I have a UIControl inside a UIScrollView. In my UIControl's init
, I rig up some touch event handlers, e.g.
[self addTarget:_delegate
action:@selector(touchedDown) forControlEvents:UIControlEventTouchDown];
iOS6 and iOS7 behave differently when I do the following:
In iOS6, my app continues to behave as intended: the tap at step #2 does not call touchedDown
-- the UIScrollView swallows the touch event as it immediately stops scrolling.
But in iOS7, the UIScrollView stops scrolling as expected, while touchedDown
is still called.
Was there a documented API change? I'd like my app to behave identically to iOS6 in iOS7.
Not very elegant, but in the absence of any better ideas, here's what's working for me now:
canCancelContentTouches
to YES
and delaysContentTouches
to NO
.userInteractionEnabled
property when the UIScrollView scrolls:- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[_contentView setUserInteractionEnabled:NO];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (!decelerate) {
[_contentView setUserInteractionEnabled:YES];
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[_contentView setUserInteractionEnabled:YES];
}
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
return YES;
}
touchesCancelled:withEvent
to reverse whatever the UIControlEventTouchDown
handler does:- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
//custom logic
}
workaround for iOS 7
@interface UIScrollViewFixed : UIScrollView
@end
@implementation UIScrollViewFixed
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (self.isDragging || self.isDecelerating) {
return self;
}
return [super hitTest:point withEvent:event];
}
@end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With