DHMovableExtension
優雅的長按Cell移動,針對UITableView與UICollectionView的Cell長按移動。
- 耦合低,代碼侵入性低
- 支持分組移動
- 可定制化移動,設置不可移動或不可交換的位置
- 極易使用
安裝
pod 'DHMovableExtension'
- 當前版本:1.0.2
使用方式
1. 引用頭文件
#import "UIScrollView+DHMovableExtension.h"
2. 配置UITableView/UICollectionView必要參數
self.tableView.movable = YES; // 必要開關
self.tableView.movableDataSource = self; // 數據源獲取代理
3. 實現數據源(DHMovableDataSource詳細說明)
>> 其中self.data為UITableView/UICollectionView的數據數組
- (NSArray *)movable_dataSource:(UIScrollView *)scrollView {
return [self.data copy];
}
- (void)movable_scrollView:(UIScrollView *)scrollView dataSourceExchanged:(NSArray *)dataSource {
// 將重排后的數據重新賦值
self.dataSource = [data copy];
}
參數說明
-
edgeScrollEnable
: 邊緣滾動使能。當跟隨手指的截圖cell移動到屏幕邊緣時,觸發引起UIScrollView是否能跟著滾動 -
edgeScrollInsets
: 邊緣觸發距離,四個方向與邊緣距離達到此值將觸發UIScrollView滾動。默認為UIEdgeInsetsZero -
minimumResponseDuration
: 最小響應手勢。長按反應時長 -
movableCellAnimationDuration
: 動畫時長。當長按生效后,cell中心點移動到手指的位置的動畫時長 -
drawMovableCellBlock
: 繪制cell截圖樣式Block。參數是截圖后的視圖,即UIImageView
,旨在修改樣式,以區分靜態的cell。其中此優先級最高,其次代理方法-movable_scrollView:drawMovableCell:
。如若此block與代理方法都沒有實現,將使用默認截圖樣式 -
exchangeDataSourceBlock
: 交換數據源,切勿期間刷新數據
DHMovableDataSource說明
注意:切勿在有關方法中調用UITableView/UICollectionView的刷新數據(如-reloadData
)方法。因為此代理響應期間正處于手勢Change狀態,刷新數據狀況將不可控。
默認交換數據方法(注意:如使用,必須兩個方法同時實現)
提供兩種數據數組的交換方式:
- 一種元素為非數組,例如:
@[@"1", @"2"]
- 一種元素為數組,例如:
@[@[@"0-0", @"0-1"], @[@"1-0"]]
/** UITableView/UICollectionView數據數組 -- 交換前 */
- (NSArray *)movable_dataSource:(UIScrollView *)scrollView;
/** 交換后數據反饋 -- 一般操作為重新復制給 原數據對象 */
- (void)movable_scrollView:(UIScrollView *)scrollView dataSourceExchanged:(NSArray *)dataSource;
自定義交換數據方法
/// 如設置此變量,將優先只用此block進行交換數據,不用movableDataSource代理
@property (nonatomic, copy) void(^exchangeDataSourceBlock) (NSIndexPath *from, NSIndexPath *to);
/// 效果同exchangeDataSourceBlock
- (void)movable_scrollView:(UIScrollView *)scrollView exchangeDataSourceAtIndexPath:(NSIndexPath *)from to:(NSIndexPath *)to;
DHMovableDelegate 說明
/** 判斷兩個位置的cell是否可以替換 */
- (BOOL)movable_scrollView:(UIScrollView *)scrollView isCellExchangeableFromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath;
/** 判斷某個IndexPath的cell是否可以移動 */
- (BOOL)movable_scrollView:(UIScrollView *)scrollView isCellMovableAtIndexPath:(NSIndexPath *)indexPath;
/**
cell將要開始移動
@param movableCell 移動的cell截圖
@param indexPath 起始位置
*/
- (void)movable_scrollView:(UIScrollView *)scrollView movableCell:(UIView *)movableCell willMoveFromIndexPath:(NSIndexPath *)indexPath;
/** 完成一次cell從from到to的移動 */
- (void)movable_scrollView:(UIScrollView *)scrollView cellDidMovedFromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath;
/**
截圖正在移動
@param movableCell 移動的cell截圖
*/
- (void)movable_scrollView:(UIScrollView *)scrollView movableCellIsMoving:(UIView *)movableCell;
/**
結束移動
@param movableCell 移動的cell截圖
@param indexPath 終止位置
*/
- (void)movable_scrollView:(UIScrollView *)scrollView movableCell:(UIView *)movableCell didEndMovedAtIndexPath:(NSIndexPath *)indexPath;
/**
繪制可移動的cell截圖,給已經截圖的cell添加樣式
@param movableCell 移動的cell截圖
*/
- (void)movable_scrollView:(UIScrollView *)scrollView drawMovableCell:(UIView *)movableCell;
效果圖
-
UITableView
table.gif -
UICollectionView
collection.gif