说是进阶,其实是把未讲完的3D Touch用法讲完。除了最简单的Qucik Action,3D Touch最常见的用法就是peek和pop。顾名思义,peek是在按压后弹出一个viewController,而pop是在peek之后持续用力按压,跳转到弹出的viewController。
3D Touch的注册
触发3D Touch之前需要注册,可以注册到当前viewController里任意一个UIView及其子类上。
//判断是否支持3D
Touchself.traitCollection.forceTouchCapability==UIForceTouchCapabilityAvailable
//注册[selfregisterForPreviewingWithDelegate:selfsourceView:self.view];
sourceView就是注册的可以触发3D Touch的View;
peek
当前viewController继承协议UIViewControllerPreviewingDelegate
实现UIViewControllerPreviewingDelegate的协议方法
-(UIViewController*)previewingContext:(id)previewingContext viewControllerForLocation:(CGPoint)location
location是触发区域,这里return需要peek的viewController
pop
在peek的基础上,实现协议方法:
-(void)previewingContext:(id)previewingContext commitViewController:(UIViewController*)viewControllerToCommit{ [selfshowViewController:viewControllerToCommit sender:self];}
peek上拉菜单
在peek的viewController里实现如下方法:
- (NSArray> *)previewActionItems {UIPreviewAction*action1 = [UIPreviewActionactionWithTitle:@"Aciton1"style:UIPreviewActionStyleDefaulthandler:^(UIPreviewAction* _Nonnull action,UIViewController* _Nonnull previewViewController) {NSLog(@"Aciton1"); }];UIPreviewAction*action2 = [UIPreviewActionactionWithTitle:@"Aciton2"style:UIPreviewActionStyleDefaulthandler:^(UIPreviewAction* _Nonnull action,UIViewController* _Nonnull previewViewController) {NSLog(@"Aciton2"); }];NSArray*actions = @[action1,action2];returnactions;}
也可以在UIViewControllerPreviewingDelegate的第一个协议方法里写业务逻辑:
vc.actions= actions
- (NSArray> *)previewActionItems{returnself.actions;}
监控压力值
API提供了相关的方法来监控压力值:
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent*)event {
//touches是所有设置了3D Touch的对象
NSArray*arrayTouch = [touches allObjects];
UITouch*touch = (UITouch*)[arrayTouch firstObject];
//可以通过tag来找到是哪个view
if(touch.view.tag==001)
{NSLog(@"压力值为%f",touch.force);}
}
结语
关于3D Touch的用法这两篇文章已经有了基本的介绍。其实稍微留意一下可以发现,许多应用对3D Touch已经有了很好的支持,例如微博,知乎...通过压力值的监控,3D Touch还能发掘出其他更深层次的玩法。
网友评论