項(xiàng)目中需要做一個(gè)如下和淘寶相同的長(zhǎng)按的交互:
首先分析要點(diǎn):
- 運(yùn)用在TableView或者CollectionView上的cell上
- 在列表進(jìn)行滑動(dòng)是會(huì)隱藏效果
- 長(zhǎng)按下一個(gè)會(huì)自動(dòng)隱藏掉上一個(gè)cell的長(zhǎng)按操作
實(shí)現(xiàn)思路
- 給cell添加長(zhǎng)按手勢(shì)
- 創(chuàng)建一個(gè)和要求效果相同的視圖柬焕,添加到當(dāng)前cell上
- 添加動(dòng)畫(huà)效果
根據(jù)以上思路效果基本完成但是還存在一下問(wèn)題:
- 如何在滾動(dòng)時(shí)取消界面上的長(zhǎng)按視圖有送?
- 如何在下一個(gè)長(zhǎng)按事件出現(xiàn)時(shí)枉侧,隱藏上一個(gè)事件票堵?
封裝占锯,自然盡量減少控件的使用復(fù)雜度
問(wèn)題1:
在長(zhǎng)按視圖中添加獲取當(dāng)前長(zhǎng)按View的父視圖添加監(jiān)聽(tīng)事件
[_viewController addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
在監(jiān)聽(tīng)到contentOffset發(fā)生變化時(shí),隱藏當(dāng)前長(zhǎng)按視圖聚霜。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"contentOffset"]) {
[self dismiss];
}
}
問(wèn)題2:
解決方法有很多種雨效,如何在使用時(shí)做的操作最少?
通過(guò)工廠方法添怔,創(chuàng)建的長(zhǎng)按視圖湾戳,在新的視圖創(chuàng)建成功時(shí),將舊的視圖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];
}