From bd0789aa8dfd1241c32cd6877fddc58bc2f2a845 Mon Sep 17 00:00:00 2001 From: Douma Fang Date: Mon, 27 Aug 2018 22:46:19 +0800 Subject: [PATCH] [WEEX-598][iOS] slider component can not request gesture stoppropagation (#1478) --- .../Component/WXCycleSliderComponent.h | 3 ++ .../Component/WXCycleSliderComponent.mm | 28 ++++++++++++++++--- .../Sources/Component/WXScrollerComponent.mm | 2 +- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/ios/sdk/WeexSDK/Sources/Component/WXCycleSliderComponent.h b/ios/sdk/WeexSDK/Sources/Component/WXCycleSliderComponent.h index 310de99fd1..55fd95e334 100644 --- a/ios/sdk/WeexSDK/Sources/Component/WXCycleSliderComponent.h +++ b/ios/sdk/WeexSDK/Sources/Component/WXCycleSliderComponent.h @@ -27,3 +27,6 @@ - (void)setIndicatorView:(WXIndicatorView *)indicatorView; @end +@interface WXRecycleSliderScrollView: UIScrollView +@end + diff --git a/ios/sdk/WeexSDK/Sources/Component/WXCycleSliderComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXCycleSliderComponent.mm index 425ca165b0..2d4a3af175 100644 --- a/ios/sdk/WeexSDK/Sources/Component/WXCycleSliderComponent.mm +++ b/ios/sdk/WeexSDK/Sources/Component/WXCycleSliderComponent.mm @@ -24,6 +24,7 @@ #import "WXSDKManager.h" #import "WXUtility.h" #import "WXComponent+Layout.h" +#import "WXComponent+Events.h" typedef NS_ENUM(NSInteger, Direction) { DirectionNone = 1 << 0, @@ -40,15 +41,16 @@ - (void)recycleSliderView:(WXRecycleSliderView *)recycleSliderView didScroll:(UI - (void)recycleSliderView:(WXRecycleSliderView *)recycleSliderView didScrollToItemAtIndex:(NSInteger)index; - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView; - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate; +- (BOOL)requestGestureShouldStopPropagation:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch; @end + @interface WXRecycleSliderView : UIView @property (nonatomic, strong) WXIndicatorView *indicator; @property (nonatomic, weak) id delegate; - -@property (nonatomic, strong) UIScrollView *scrollView; +@property (nonatomic, strong) WXRecycleSliderScrollView *scrollView; @property (nonatomic, strong) NSMutableArray *itemViews; @property (nonatomic, assign) Direction direction; @property (nonatomic, assign) NSInteger currentIndex; @@ -70,7 +72,7 @@ - (id)initWithFrame:(CGRect)frame if (self) { _currentIndex = 0; _itemViews = [[NSMutableArray alloc] init]; - _scrollView = [[UIScrollView alloc] init]; + _scrollView = [[WXRecycleSliderScrollView alloc] init]; _scrollView.backgroundColor = [UIColor clearColor]; _scrollView.delegate = self; _scrollView.showsHorizontalScrollIndicator = NO; @@ -256,7 +258,6 @@ - (void)nextPage { - (void)lastPage { - NSInteger lastIndex = [self currentIndex]-1; if (_itemViews.count > 1) { if (_infinite) { @@ -589,6 +590,11 @@ - (void)removeEvent:(NSString *)eventName } } +- (BOOL)requestGestureShouldStopPropagation:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch +{ + return [self gestureShouldStopPropagation:gestureRecognizer shouldReceiveTouch:touch]; +} + #pragma mark WXIndicatorComponentDelegate Methods -(void)setIndicatorView:(WXIndicatorView *)indicatorView @@ -680,3 +686,17 @@ - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL } @end + +@implementation WXRecycleSliderScrollView +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch +{ + WXRecycleSliderView *view = (WXRecycleSliderView *)self.delegate; + if ([(id ) view.wx_component respondsToSelector:@selector(requestGestureShouldStopPropagation:shouldReceiveTouch:)]) { + return [(id ) view.wx_component requestGestureShouldStopPropagation:gestureRecognizer shouldReceiveTouch:touch]; + } + else{ + return YES; + } +} +@end + diff --git a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.mm index b59bc9a417..bbc780a6f4 100644 --- a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.mm +++ b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.mm @@ -191,7 +191,7 @@ - (void)viewDidLoad { [super viewDidLoad]; [self setContentSize:_contentSize]; - WXScrollerComponentView* scrollView = (WXScrollerComponentView *)self.view; + WXScrollerComponentView *scrollView = (WXScrollerComponentView *)self.view; scrollView.delegate = self; scrollView.exclusiveTouch = YES; scrollView.autoresizesSubviews = NO;