You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by cx...@apache.org on 2017/08/09 06:50:26 UTC
[4/6] incubator-weex git commit: -[ios] remove drag methods from
WXRecyclerComponent
-[ios] remove drag methods from WXRecyclerComponent
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/c6e1dbe2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/c6e1dbe2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/c6e1dbe2
Branch: refs/heads/0.16-dev
Commit: c6e1dbe260c63ea34a02d31fd6c104099018c9c4
Parents: 62c1270
Author: ximu <xi...@alibaba-inc.com>
Authored: Tue Aug 1 11:06:41 2017 +0800
Committer: ximu <xi...@alibaba-inc.com>
Committed: Tue Aug 1 11:06:41 2017 +0800
----------------------------------------------------------------------
.../Component/Recycler/WXRecyclerComponent.m | 226 +++----------------
1 file changed, 30 insertions(+), 196 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/c6e1dbe2/ios/sdk/WeexSDK/Sources/Component/Recycler/WXRecyclerComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/Recycler/WXRecyclerComponent.m b/ios/sdk/WeexSDK/Sources/Component/Recycler/WXRecyclerComponent.m
index 523bd83..1164472 100644
--- a/ios/sdk/WeexSDK/Sources/Component/Recycler/WXRecyclerComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/Recycler/WXRecyclerComponent.m
@@ -32,6 +32,7 @@
#import "WXMonitor.h"
#import "NSObject+WXSwizzle.h"
#import "WXComponent+Events.h"
+#import "WXRecyclerDragController.h"
static NSString * const kCollectionCellReuseIdentifier = @"WXRecyclerCell";
static NSString * const kCollectionHeaderReuseIdentifier = @"WXRecyclerHeader";
@@ -43,12 +44,6 @@ typedef enum : NSUInteger {
WXRecyclerLayoutTypeGrid,
} WXRecyclerLayoutType;
-typedef enum : NSUInteger {
- WXRecyclerDragTriggerNormal,
- WXRecyclerDragTriggerPan
-} WXRecyclerDragTriggerType;
-
-
@interface WXCollectionView : UICollectionView
@end
@@ -91,20 +86,12 @@ typedef enum : NSUInteger {
@end
-@interface WXRecyclerComponent () <UICollectionViewDataSource, UICollectionViewDelegate, WXMultiColumnLayoutDelegate, WXRecyclerUpdateControllerDelegate, WXCellRenderDelegate, WXHeaderRenderDelegate>
+@interface WXRecyclerComponent () <UICollectionViewDataSource, UICollectionViewDelegate, WXMultiColumnLayoutDelegate, WXRecyclerUpdateControllerDelegate, WXCellRenderDelegate, WXHeaderRenderDelegate, WXRecyclerDragControllerDelegate>
@property (nonatomic, strong, readonly) WXRecyclerDataController *dataController;
@property (nonatomic, strong, readonly) WXRecyclerUpdateController *updateController;
@property (nonatomic, weak, readonly) UICollectionView *collectionView;
-@property (nonatomic, strong) UILongPressGestureRecognizer *currentLongPress;
-@property (nonatomic, strong) NSIndexPath *startIndexPath;
-@property (nonatomic, strong) NSIndexPath *dragingIndexPath;
-@property (nonatomic, strong) NSIndexPath *targetIndexPath;
-@property (nonatomic, strong) NSMutableArray *excludedAry;
-@property (nonatomic, strong) UICollectionViewCell *dragingCell;
-@property (nonatomic, assign) BOOL isDragable;
-@property (nonatomic, assign) BOOL isDragAnchor;
-@property (nonatomic, assign) WXRecyclerDragTriggerType dragTriggerType;
+@property (nonatomic, strong) WXRecyclerDragController *dragController;
@end
@@ -122,14 +109,6 @@ typedef enum : NSUInteger {
if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
[self _fillPadding];
- if ([attributes[@"draggable"] boolValue]) {
- if([attributes[@"dragTriggerType"] isEqual: @"pan"]){
- _dragTriggerType = WXRecyclerDragTriggerPan;
- }
- _isDragable = YES;
- }else{
- _isDragable = NO;
- }
if ([type isEqualToString:@"waterfall"] || (attributes[@"layout"] && [attributes[@"layout"] isEqualToString:@"multi-column"])) {
// TODO: abstraction
@@ -150,6 +129,17 @@ typedef enum : NSUInteger {
_updateController = [WXRecyclerUpdateController new];
_updateController.delegate = self;
[self fixFlicker];
+
+ _dragController = [WXRecyclerDragController new];
+ _dragController.delegate = self;
+ if ([attributes[@"draggable"] boolValue]) {
+ if([attributes[@"dragTriggerType"] isEqual: @"pan"]){
+ _dragController.dragTriggerType = WXRecyclerDragTriggerPan;
+ }
+ _dragController.isDragable = YES;
+ }else{
+ _dragController.isDragable = NO;
+ }
}
return self;
@@ -181,20 +171,8 @@ typedef enum : NSUInteger {
[_collectionView registerClass:[WXCollectionViewCell class] forCellWithReuseIdentifier:kCollectionCellReuseIdentifier];
[_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:kCollectionSupplementaryViewKindHeader withReuseIdentifier:kCollectionHeaderReuseIdentifier];
- _isDragAnchor = NO;
-
- _excludedAry = [[NSMutableArray alloc] init];
- [_collectionView registerClass:[WXCollectionViewCell class] forCellWithReuseIdentifier:kCollectionCellReuseIdentifier];
- [_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:kCollectionSupplementaryViewKindHeader withReuseIdentifier:kCollectionHeaderReuseIdentifier];
-
- _currentLongPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressMethod:)];
- _currentLongPress.minimumPressDuration = 0.3f;
- [_collectionView addGestureRecognizer:_currentLongPress];
-
- _dragingCell = [[WXCollectionViewCell alloc] initWithFrame:CGRectMake(0, 0, 100, 100/2.0f)];
- _dragingCell.hidden = true;
- [_collectionView addSubview:_dragingCell];
-
+ _dragController.dragingCell = [[WXCollectionViewCell alloc] initWithFrame:CGRectMake(0, 0, 100, 100/2.0f)];
+ _dragController.collectionView = _collectionView;
[self performUpdatesWithCompletion:^(BOOL finished) {
@@ -220,11 +198,11 @@ typedef enum : NSUInteger {
if ([attributes[@"draggable"] boolValue]) {
if([attributes[@"dragTriggerType"] isEqual: @"pan"]){
- _dragTriggerType = WXRecyclerDragTriggerPan;
+ _dragController.dragTriggerType = WXRecyclerDragTriggerPan;
}
- _isDragable = YES;
+ _dragController.isDragable = YES;
}else{
- _isDragable = NO;
+ _dragController.isDragable = NO;
}
if (attributes[@"columnWidth"]) {
@@ -403,7 +381,7 @@ typedef enum : NSUInteger {
cellView.wx_component = contentView.wx_component;
- [self goThroughAnchor:cellView.wx_component indexPath:indexPath];
+ [self.dragController goThroughAnchor:cellView.wx_component indexPath:indexPath];
if (contentView.superview == cellView.contentView) {
return cellView;
@@ -707,164 +685,20 @@ typedef enum : NSUInteger {
});
}
-#pragma mark - dragMethod
-- (void)longPressMethod:(UILongPressGestureRecognizer*)gesture
-{
- if (_isDragable) {
- switch (gesture.state) {
- case UIGestureRecognizerStateBegan:
- [self dragBegin:gesture];
- break;
- case UIGestureRecognizerStateChanged:
- [self dragChanged:gesture];
- break;
- case UIGestureRecognizerStateEnded:
- [self dragEnd:gesture];
- break;
- default:
- break;
- }
- }
-}
+#define mark dragControllerDelegate
-- (void)dragBegin:(UILongPressGestureRecognizer *)gesture{
-
- CGPoint point = [gesture locationInView:_collectionView];
-
- _startIndexPath = [self getDragingIndexPathWithPoint:point];
- if (!_startIndexPath) {
- return;
+- (void)updateDataSource{
+ NSMutableArray *oldComponents = [[NSMutableArray alloc] initWithArray:self.dataController.sections[self.dragController.startIndexPath.section].cellComponents];
+ if(oldComponents.count > 1){
+ WXCellComponent *startComponent = self.dataController.sections[self.dragController.startIndexPath.section].cellComponents[self.dragController.startIndexPath.item];
+ [oldComponents removeObject:startComponent];
+ [oldComponents insertObject:startComponent atIndex:self.dragController.targetIndexPath.item];
+ self.dataController.sections[self.dragController.startIndexPath.section].cellComponents = oldComponents;
}
-
- [self fireEvent:@"dragstart" params:@{@"fromIndex":[NSString stringWithFormat:@"%ld",(long)_startIndexPath.row]}];
-
- _dragingIndexPath = [self getDragingIndexPathWithPoint:point];
- if (!_dragingIndexPath) {
- return;
- }
-
- [_collectionView bringSubviewToFront:_dragingCell];
- _dragingCell.frame = [_collectionView cellForItemAtIndexPath:_dragingIndexPath].frame;
- _dragingCell.hidden = false;
- [UIView animateWithDuration:0.3 animations:^{
- [_dragingCell setTransform:CGAffineTransformMakeScale(1.2, 1.2)];
- }];
}
-- (void)dragChanged:(UILongPressGestureRecognizer *)gesture{
-
- if (!_startIndexPath) {
- return;
- }
- CGPoint point = [gesture locationInView:_collectionView];
- _dragingCell.center = point;
- _targetIndexPath = [self getTargetIndexPathWithPoint:point];
-
- if (_targetIndexPath && _dragingIndexPath && (_targetIndexPath.section == _startIndexPath.section)){
- [_collectionView moveItemAtIndexPath:_dragingIndexPath toIndexPath:_targetIndexPath];
- _dragingIndexPath = _targetIndexPath;
- }
-}
-
-- (void)dragEnd:(UILongPressGestureRecognizer *)gesture{
-
- if (!_startIndexPath || !_dragingIndexPath) {
- return;
- }
-
- [self fireEvent:@"dragend" params:@{@"toIndex":[NSString stringWithFormat:@"%ld",(long)_dragingIndexPath.row],@"fromIndex":[NSString stringWithFormat:@"%ld",(long)_startIndexPath.row]}];
-
- CGRect endFrame = [_collectionView cellForItemAtIndexPath:_dragingIndexPath].frame;
-
- __weak typeof(self) weakSelf = self;
- [UIView animateWithDuration:0.3 animations:^{
- [weakSelf.dragingCell setTransform:CGAffineTransformMakeScale(1.0, 1.0)];
- weakSelf.dragingCell.frame = endFrame;
- } completion:^(BOOL finished) {
- weakSelf.dragingCell.hidden = YES;
- NSMutableArray *oldComponents = [[NSMutableArray alloc] initWithArray:weakSelf.dataController.sections[weakSelf.startIndexPath.section].cellComponents];
- if(oldComponents.count > 1){
- WXCellComponent *startComponent = weakSelf.dataController.sections[weakSelf.startIndexPath.section].cellComponents[weakSelf.startIndexPath.item];
- [oldComponents removeObject:startComponent];
- [oldComponents insertObject:startComponent atIndex:weakSelf.targetIndexPath.item];
- weakSelf.dataController.sections[weakSelf.startIndexPath.section].cellComponents = oldComponents;
- }
- }];
-}
-
-- (NSIndexPath *)getDragingIndexPathWithPoint:(CGPoint)point{
- NSIndexPath *dragingIndexPath = nil;
- for (NSIndexPath *indexPath in [_collectionView indexPathsForVisibleItems]){
- if (CGRectContainsPoint([_collectionView cellForItemAtIndexPath:indexPath].frame,point)) {
- dragingIndexPath = indexPath;
- break;
- }
- }
-
- BOOL isExcluded = NO;
- if (dragingIndexPath) {
- for (NSIndexPath *indexPath in _excludedAry) {
- if (indexPath.row == dragingIndexPath.row) {
- isExcluded = YES;
- }
- }
- }
- return isExcluded?nil:dragingIndexPath;
-}
-
-- (NSIndexPath *)getTargetIndexPathWithPoint:(CGPoint)point{
- NSIndexPath *targetIndexPath = nil;
- for (NSIndexPath *indexPath in _collectionView.indexPathsForVisibleItems) {
- if (CGRectContainsPoint([_collectionView cellForItemAtIndexPath:indexPath].frame, point)) {
- targetIndexPath = indexPath;
- }
- }
- return targetIndexPath;
-}
-
-
-- (void)goThroughAnchor:(WXComponent *)wxComponent indexPath:(NSIndexPath *)indexPath{
- if (wxComponent.attributes && [wxComponent.attributes[@"dragExcluded"] boolValue]){
- [_excludedAry addObject:indexPath];
- NSSet *set = [NSSet setWithArray:_excludedAry];
- [_excludedAry removeAllObjects];
- [_excludedAry addObjectsFromArray:[set allObjects]];
- }
-
- //遍历获取锚点
- NSMutableArray *subviewComponents = [[NSMutableArray alloc] init];
- [subviewComponents addObjectsFromArray:wxComponent.subcomponents];
- WXComponent *anchorComponent;
- for (int i = 0 ; i < subviewComponents.count ; i++){
- WXComponent *compoent = subviewComponents[i];
- if (compoent.attributes[@"dragAnchor"]) {
- anchorComponent = compoent;
- _isDragAnchor = YES;
- break;
- }
-
- if (compoent.subcomponents && compoent.subcomponents.count && compoent.subcomponents.count > 0) {
- [subviewComponents addObjectsFromArray:compoent.subcomponents];
- }
- }
-
- if (anchorComponent) {
- //去除全局UILongPressGestureRecognizer手势
- if (_currentLongPress) {
- [self.collectionView removeGestureRecognizer:_currentLongPress];
- _currentLongPress = nil;
- }
-
- //添加锚点的手势
- if (_dragTriggerType == WXRecyclerDragTriggerPan) {
- UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(longPressMethod:)];
- [anchorComponent.view addGestureRecognizer:panGestureRecognizer];
-
- }else{
- UILongPressGestureRecognizer *longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressMethod:)];
- [anchorComponent.view addGestureRecognizer:longPressGestureRecognizer];
- }
- }
+- (void)dragFireEvent:(NSString *)eventName params:(NSDictionary *)params{
+ [self fireEvent:eventName params:params];
}
- (void)fixedFlickerSelector