3DTouch

来源:互联网 发布:矩阵分析视频百度云 编辑:程序博客网 时间:2024/05/23 05:07

iOS9中新增添了一个耀眼的功能,那就是新一代多点触控技术3D-Touch,想必大家都已经关注到了,3D-Touch有Peek and Pop 功能以及重力点击应用图标时弹出的ShortcutItem。一拿到6s那会便迫不及待地想试试这个牛逼哄哄滴新功能,对了3D-Touch需要硬件支持,目前只有6s和6sp支持。

首先是Peek and Pop 功能

1、首先是判断当前设备是否支持3D-Touch

self.traitCollection.forceTouchCapability==UIForceTouchCapabilityAvailable

2、在需要使用3D-Touch的Peek and Pop功能的地方调用以下代码

   //Registers a view controller to participate with 3D Touch preview (peek) and commit (pop).        [self registerForPreviewingWithDelegate:self sourceView:self.view];   //遵守协议UIViewControllerPreviewingDelegate,并实现方法previewingContext:viewControllerForLocation:和previewingContext:commitViewController:

3、添加UIPreviewAction

在需要添加UIPreviewAction的ViewControll方法中重写previewActionItems,并且放回一个元素为UIPreviewAction的数组-(NSArray<id<UIPreviewActionItem>>*)previewActionItems{    return self.kPreviewActionItems;}#pragma mark - Lazy Method-(NSMutableArray *)kPreviewActionItems{    if (_kPreviewActionItems==nil) {        _kPreviewActionItems=[[NSMutableArray alloc] init];        UIPreviewAction *cancelAction=[UIPreviewAction actionWithTitle:@"取消" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {            NSLog(@"取消");        }];        UIPreviewAction *firstAction=[UIPreviewAction actionWithTitle:@"第一个" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {            NSLog(@"第一个 选中");        }];        UIPreviewAction *secondAction=[UIPreviewAction actionWithTitle:@"第二个" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {            NSLog(@"第二个");        }];        [_kPreviewActionItems addObject:firstAction];        [_kPreviewActionItems addObject:secondAction];        [_kPreviewActionItems addObject:cancelAction];    }    return _kPreviewActionItems;}

完整代码如下:
AppDelegate:

#import "AppDelegate.h"#import "ViewController.h"@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    // Override point for customization after application launch.    ViewController *VC=[[ViewController alloc] init];    UINavigationController *navi=[[UINavigationController alloc] initWithRootViewController:VC];    self.window.rootViewController=navi;    return YES;}

ViewController:

#import "ViewController.h"#import "DetailViewController.h"@interface ViewController () <UIViewControllerPreviewingDelegate>@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    self.view.backgroundColor=[UIColor whiteColor];    UIBarButtonItem *rightItem=[[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStylePlain target:self action:@selector(nextAction)];    self.navigationItem.rightBarButtonItem=rightItem;    UIBarButtonItem *backItem=[[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStylePlain target:nil action:nil];    self.navigationItem.backBarButtonItem=backItem;    //check if the device supports 3DTouch    if (self.traitCollection.forceTouchCapability==UIForceTouchCapabilityAvailable) {            //Registers a view controller to participate with 3D Touch preview (peek) and commit (pop).        [self registerForPreviewingWithDelegate:self sourceView:self.view];    }}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];}#pragma mark - UIViewControllerPreviewingDelegate-(UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{    DetailViewController *VC=[[DetailViewController alloc] init];        //可以设置大小//    VC.preferredContentSize=CGSizeMake(0.0, 400);    return VC;}-(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit{    [self showViewController:viewControllerToCommit sender:self];}#pragma mark - Action Method-(void)nextAction{    DetailViewController *VC=[[DetailViewController alloc] init];    [self.navigationController pushViewController:VC animated:YES];}@end

DetailViewController:

#import "DetailViewController.h"@interface DetailViewController ()@property(nonatomic,retain) NSMutableArray *kPreviewActionItems;@end@implementation DetailViewController#pragma mark - Life Cycle- (void)viewDidLoad {    [super viewDidLoad];    self.view.backgroundColor=[UIColor grayColor];}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];}#pragma mark - Override-(NSArray<id<UIPreviewActionItem>>*)previewActionItems{    return self.kPreviewActionItems;}#pragma mark - Lazy Method-(NSMutableArray *)kPreviewActionItems{    if (_kPreviewActionItems==nil) {        _kPreviewActionItems=[[NSMutableArray alloc] init];        UIPreviewAction *cancelAction=[UIPreviewAction actionWithTitle:@"取消" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {            NSLog(@"取消");        }];        UIPreviewAction *firstAction=[UIPreviewAction actionWithTitle:@"第一个" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {            NSLog(@"第一个 选中");        }];        UIPreviewAction *secondAction=[UIPreviewAction actionWithTitle:@"第二个" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {            NSLog(@"第二个");        }];        [_kPreviewActionItems addObject:firstAction];        [_kPreviewActionItems addObject:secondAction];        [_kPreviewActionItems addObject:cancelAction];    }    return _kPreviewActionItems;}@end

UIApplicationShortcutItem:重压应用图标时

有两种方法,一种是在Info.plist中进行静态设置,一种是用代码动态设置。我偏向第二种,所以下面的方法也是第二种方法。

1、在ViewController中设置应用程序的UIApplicationShortcutItem

-(void)shortCutItemConfig{    UIApplicationShortcutItem *item1=[[UIApplicationShortcutItem alloc] initWithType:@"1" localizedTitle:@"第一个标签" localizedSubtitle:nil icon:nil userInfo:nil];    UIApplicationShortcutIcon *icon2=[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeFavorite];    UIApplicationShortcutItem *item2=[[UIApplicationShortcutItem alloc] initWithType:@"2" localizedTitle:@"第二个标签" localizedSubtitle:@"你好,色彩" icon:icon2 userInfo:nil];    UIApplicationShortcutIcon *icon3=[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeMessage];    UIApplicationShortcutItem *item3=[[UIApplicationShortcutItem alloc] initWithType:@"3" localizedTitle:@"第三个标签" localizedSubtitle:@"消息" icon:icon3 userInfo:nil];     UIApplicationShortcutIcon *icon4=[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];    UIApplicationShortcutItem *item4=[[UIApplicationShortcutItem alloc] initWithType:@"4" localizedTitle:@"第四个标签" localizedSubtitle:@"爱神" icon:icon4 userInfo:nil];    [UIApplication sharedApplication].shortcutItems=@[item4,item3,item2,item1];}

2、用户点击UIApplicationShortcutItem时,在AppDelegate中进行相应的响应

-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions{//判断应用是不是从UIApplicationShortcutItem进入的    NSString *shortcutItemKey=[launchOptions objectForKey:UIApplicationLaunchOptionsShortcutItemKey];    NSLog(@"shortcutItemKey=%@",shortcutItemKey);    if ([shortcutItemKey intValue]>=1) {        return NO;    }    return YES;}//当我们点击标签进入应用程序时,也可以进行一些操作。当我们通过标签进入app时,就会调用这样一个回调,我们可以获取shortcutItem的信息进行相关逻辑操作//except when -application:willFinishLaunchingWithOptions: or -application:didFinishLaunchingWithOptions returns NO.-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler{    ViewController *VC=[[ViewController alloc] init];    UINavigationController *navi=[[UINavigationController alloc] initWithRootViewController:VC];    self.window.rootViewController=navi;    NSLog(@"shortcutItem=%@",shortcutItem);    int type=[shortcutItem.type intValue]-1;    UIViewController *viewController;    NSArray *classArr=@[[FirstViewController class],[SecondViewController class],[ThirdViewController class],[ForthViewController class]];    viewController=[[[classArr objectAtIndex:type] alloc] init];    [navi pushViewController:viewController animated:YES];}
0 0
原创粉丝点击