不知道大家有沒有發(fā)現(xiàn)微信聊天歷史列表、蘋果自帶的通訊錄歷史記錄等應(yīng)用如隱藏的長按功能肺孵。哈哈匀借,如果沒有也不要氣餒,也不要懷疑人生平窘。要不就要換手機了吓肋,要不就要升級系統(tǒng)了!
這個功能看著挺炫的瑰艘,也挺方便的吧蓬坡,如果看歷史記錄等等其他快捷操作的一個入口。如果沒有想到正確的實現(xiàn)方法磅叛,可能會實現(xiàn)起來很難屑咳,或者效果沒有這么好。如果找到了正確的方法弊琴,其實實現(xiàn)起來非常簡單兆龙。
其實這個效果就是利用了蘋果的3Dtouch,不支持3Dtouch的手機或系統(tǒng)就沒法體驗到了敲董。
賣了一個大關(guān)子紫皇,也索羅了一頓,接下來讓我看看如何實現(xiàn)的腋寨。哈哈聪铺。
給需要的UIView注冊3DTouch行為
[self registerForPreviewingWithDelegate:self sourceView:cell];
這個方法其實就是UIViewController
的方法,最后一個參數(shù)就是指定需要添加3DTouch的View萄窜,這里我們要加的是我們自己的tableviewcell.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
MYTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MYTableViewCell" forIndexPath:indexPath];
[self registerForPreviewingWithDelegate:self sourceView:cell];
return cell;
}
實現(xiàn)UIViewControllerPreviewingDelegate
協(xié)議
這個協(xié)議有兩個方法我們都要實現(xiàn)
- 第一個
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
PreViewController *vc = [[PreViewController alloc] init];
return vc;
}
這個協(xié)議方法就是我們3DTouch之后要顯示的視圖铃剔,想顯示什么就自己實現(xiàn),完全可以由自己來控制
- 第二個
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit{
[self showViewController:viewControllerToCommit sender:self];
}
這個協(xié)議方法就是將我們的視圖顯示出來
華麗的分割線查刻,到這里基本就實現(xiàn)了長按彈出視圖的效果键兜,細心的人可能發(fā)現(xiàn)其實還有一個效果就是長按出現(xiàn)視圖之后可以向上滑動出現(xiàn),之后出現(xiàn)了幾個按鈕穗泵。接下來讓我們看看怎么加上那幾個按鈕普气。
其實加這幾個按鈕也非常簡單。找到我們之前定義的PreViewController
這個類佃延,然后重寫-(NSArray<id<UIPreviewActionItem>> *)previewActionItems
這個方法也是UIViewController
中本身自帶的现诀。
-(NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
UIPreviewAction *p1 = [UIPreviewAction actionWithTitle:@"刪除" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"點擊了刪除");
}];
UIPreviewAction *p2 = [UIPreviewAction actionWithTitle:@"撤銷" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"點擊了撤銷");
}];
return @[p1,p2];
}