diff --git a/dom/include/dom/dom_listener.h b/dom/include/dom/dom_listener.h index c68187752..097a7f938 100644 --- a/dom/include/dom/dom_listener.h +++ b/dom/include/dom/dom_listener.h @@ -14,6 +14,8 @@ constexpr char kLongClickEvent[] = "longclick"; constexpr char kTouchStartEvent[] = "touchstart"; constexpr char kTouchMoveEvent[] = "tourchmove"; constexpr char kTouchEndEvent[] = "touchend"; +constexpr char kPressIn[] = "pressin"; +constexpr char kPressOut[] = "pressout"; constexpr char kTouchCancelEvent[] = "touchcancel"; constexpr char kLayoutEvent[] = "layout"; constexpr char kShowEvent[] = "show"; diff --git a/ios/sdk/base/HippyBatchedBridge.mm b/ios/sdk/base/HippyBatchedBridge.mm index 7f8abff20..facff824d 100644 --- a/ios/sdk/base/HippyBatchedBridge.mm +++ b/ios/sdk/base/HippyBatchedBridge.mm @@ -79,6 +79,8 @@ typedef NS_ENUM(NSUInteger, HippyBridgeFields) { HippyDisplayLink *_displayLink; NSDictionary *_dimDic; HippyDevManager *_devManager; + std::shared_ptr _domManager; + std::shared_ptr _nativeRenderManager; } @synthesize flowID = _flowID; @@ -755,11 +757,11 @@ HIPPY_NOT_IMPLEMENTED(-(instancetype)initWithBundleURL HippyUIManager *uiManager = [self moduleForName:@"UIManager"]; UIView *rootView = [[notification userInfo] objectForKey:HippyUIManagerRootViewKey]; int32_t rootTag = [[rootView hippyTag] intValue]; - std::shared_ptr domManager = std::make_shared(rootTag); - domManager->SetRootSize(CGRectGetWidth(rootView.bounds), CGRectGetHeight(rootView.bounds)); - std::shared_ptr nativeRenderManager = std::make_shared(uiManager); - domManager->SetRenderManager(nativeRenderManager); - self.javaScriptExecutor.pScope->SetDomManager(domManager); + _domManager = std::make_shared(rootTag); + _domManager->SetRootSize(CGRectGetWidth(rootView.bounds), CGRectGetHeight(rootView.bounds)); + _nativeRenderManager = std::make_shared(uiManager); + _domManager->SetRenderManager(_nativeRenderManager); + self.javaScriptExecutor.pScope->SetDomManager(_domManager); } #pragma mark - HippyInvalidating diff --git a/ios/sdk/base/HippyTouchHandler.mm b/ios/sdk/base/HippyTouchHandler.mm index bfcbc4e9c..ca781373b 100644 --- a/ios/sdk/base/HippyTouchHandler.mm +++ b/ios/sdk/base/HippyTouchHandler.mm @@ -212,9 +212,11 @@ typedef void (^ViewBlock)(UIView *view, BOOL *stop); if (result[@"onPressOut"][@"view"]) { UIView *pressOutView = result[@"onPressOut"][@"view"]; - if (pressOutView == _onPressInView && pressOutView.onPressOut) { + onTouchEventListener listener = [_onLongClickView eventListenerForEventType:HippyViewEventTypePressOut]; + if (pressOutView == _onPressInView && listener) { if ([self checkViewBelongToTouchHandler:pressOutView]) { - pressOutView.onPressOut(@{}); +// pressOutView.onPressOut(@{}); + listener(CGPointZero); _onPressInView = nil; _bPressIn = NO; } @@ -279,9 +281,11 @@ typedef void (^ViewBlock)(UIView *view, BOOL *stop); if (result[@"onPressOut"][@"view"]) { UIView *pressOutView = result[@"onPressOut"][@"view"]; - if (pressOutView == _onPressInView && pressOutView.onPressOut) { + onTouchEventListener listener = [_onLongClickView eventListenerForEventType:HippyViewEventTypePressOut]; + if (pressOutView == _onPressInView && listener) { if ([self checkViewBelongToTouchHandler:pressOutView]) { - pressOutView.onPressOut(@{}); +// pressOutView.onPressOut(@{}); + listener(CGPointZero); } } } @@ -384,9 +388,11 @@ typedef void (^ViewBlock)(UIView *view, BOOL *stop); - (void)scheduleTimer:(__unused NSTimer *)timer { if (!_bPressIn) { + onTouchEventListener listener = [_onLongClickView eventListenerForEventType:HippyViewEventTypePressIn]; if (_onPressInView && _onPressInView.onPressIn) { if ([self checkViewBelongToTouchHandler:_onPressInView]) { - _onPressInView.onPressIn(@{}); +// _onPressInView.onPressIn(@{}); + listener(CGPointZero); } } _bPressIn = YES; @@ -453,19 +459,19 @@ typedef void (^ViewBlock)(UIView *view, BOOL *stop); if ((touchInterceptEvent && findActions.count == 0) || [view isKindOfClass:NSClassFromString(@"HippyRootContentView")]) { break; } else { - - if ([findActions containsObject:@"onPressIn"] && view.onPressIn) { + onTouchEventListener listener = [view eventListenerForEventType:HippyViewEventTypePressIn]; + if ([findActions containsObject:@"onPressIn"] && listener) { if (!result[@"onClick"]) { [result setValue:@{ @"view": view, @"index": @(index) } forKey:@"onPressIn"]; } [findActions removeObject:@"onPressIn"]; } - - if ([findActions containsObject:@"onPressOut"] && view.onPressOut) { + listener = [view eventListenerForEventType:HippyViewEventTypePressOut]; + if ([findActions containsObject:@"onPressOut"] && listener) { [result setValue:@{ @"view": view, @"index": @(index) } forKey:@"onPressOut"]; [findActions removeObject:@"onPressOut"]; } - onTouchEventListener listener = [view eventListenerForEventType:HippyViewEventTypeClick]; + listener = [view eventListenerForEventType:HippyViewEventTypeClick]; if ([findActions containsObject:@"onClick"] && listener) { if (![view interceptTouchEvent]) { [result setValue:@{ @"view": view, @"index": @(index) } forKey:@"onClick"]; @@ -555,9 +561,11 @@ typedef void (^ViewBlock)(UIView *view, BOOL *stop); - (void)cancelTouch { if (_onPressInView) { _bPressIn = NO; - if (_onPressInView.onPressOut) { + onTouchEventListener listener = [_onLongClickView eventListenerForEventType:HippyViewEventTypePressOut]; + if (listener) { if ([self checkViewBelongToTouchHandler:_onPressInView]) { - _onPressInView.onPressOut(@{}); +// _onPressInView.onPressOut(@{}); + listener(CGPointZero); } } } @@ -578,9 +586,11 @@ typedef void (^ViewBlock)(UIView *view, BOOL *stop); if (_onPressInView) { _bPressIn = NO; - if (_onPressInView.onPressOut) { + onTouchEventListener listener = [_onLongClickView eventListenerForEventType:HippyViewEventTypePressOut]; + if (listener) { if ([self checkViewBelongToTouchHandler:_onPressInView]) { - _onPressInView.onPressOut(@{}); +// _onPressInView.onPressOut(@{}); + listener(CGPointZero); } } } diff --git a/ios/sdk/component/view/UIView+Hippy.h b/ios/sdk/component/view/UIView+Hippy.h index f8a7b8de3..25c0db3b7 100644 --- a/ios/sdk/component/view/UIView+Hippy.h +++ b/ios/sdk/component/view/UIView+Hippy.h @@ -141,6 +141,9 @@ typedef NS_ENUM(NSInteger, HippyViewEventType) { HippyViewEventTypeTouchEnd, HippyViewEventTypeTouchCancel, + HippyViewEventTypePressIn, + HippyViewEventTypePressOut, + HippyViewEventTypeLayout, //show event diff --git a/ios/sdk/module/uimanager/HippyUIManager.mm b/ios/sdk/module/uimanager/HippyUIManager.mm index b809a8c2f..8b0b53e59 100644 --- a/ios/sdk/module/uimanager/HippyUIManager.mm +++ b/ios/sdk/module/uimanager/HippyUIManager.mm @@ -1789,6 +1789,21 @@ static UIView *_jsResponder; } } +- (void) addPressEventListenerforNode:(std::weak_ptr)weak_node + forType:(std::string)type + forView:(int32_t)hippyTag { + UIView *view = [self viewForHippyTag:@(hippyTag)]; + HippyViewEventType eventType = hippy::kPressIn == type ? HippyViewEventType::HippyViewEventTypePressIn : HippyViewEventType::HippyViewEventTypePressOut; + if (view) { + [view addViewEvent:eventType eventListener:^(CGPoint) { + std::shared_ptr node = weak_node.lock(); + if (node) { + node->HandleEvent(std::make_shared(hippy::kClickEvent, weak_node, nullptr)); + } + }]; + } +} + - (void) addTouchEventListenerforNode:(std::weak_ptr)weak_node forType:(std::string)type forView:(int32_t)hippyTag {