项目中需要做一个如下和淘宝相同的长按的交互:
首先分析要点:
- 运用在TableView或者CollectionView上的cell上
- 在列表进行滑动是会隐藏效果
- 长按下一个会自动隐藏掉上一个cell的长按操作
实现思路
- 给cell添加长按手势
- 创建一个和要求效果相同的视图,添加到当前cell上
- 添加动画效果
根据以上思路效果基本完成但是还存在一下问题:
- 如何在滚动时取消界面上的长按视图?
- 如何在下一个长按事件出现时,隐藏上一个事件?
封装,自然尽量减少控件的使用复杂度
问题1:
在长按视图中添加获取当前长按View的父视图添加监听事件
[_viewController addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
在监听到contentOffset发生变化时,隐藏当前长按视图。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"contentOffset"]) {
[self dismiss];
}
}
问题2:
解决方法有很多种,如何在使用时做的操作最少?
通过工厂方法,创建的长按视图,在新的视图创建成功时,将旧的视图dismiss掉。
+ (instancetype)shareManager {
static LongPressFactory *shareManager = nil;
static dispatch_once_t once;
dispatch_once(&once, ^{
shareManager = [[self alloc] init];
});
return shareManager;
}
- (LongPressView *)createLongPress {
LongPressView *press = [[LongPressView alloc] init];
[self resetFactory];
[self.factoryGoods addObject:press];
return press;
}
- (void)resetFactory {
for (LongPressView *lpView in self.factoryGoods) {
[lpView dismiss];
}
[self.factoryGoods removeAllObjects];
}