3DTouch

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>*)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)previewingContext viewControllerForLocation:(CGPoint)location{
    DetailViewController *VC=[[DetailViewController alloc] init];
        //可以设置大小
//    VC.preferredContentSize=CGSizeMake(0.0, 400);
    return VC;
}

-(void)previewingContext:(id)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>*)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];
}

你可能感兴趣的:(iOS,9)