3DTouch

3DTouch是iOS9出的新特性,用戶可以在手機主屏幕和app內部使用

1. 主屏幕的快捷操作

當用戶按壓應用圖標是會彈出快捷操作列表,當用戶選擇選擇一個快捷操作是,應用會被激活或者啓動,同事你的代理對象會收到快捷操作的信息。

image: ../Art/maps_directions_home_2x.png

  • 固定的快捷操作:需要在Info.plist裏設置 UIApplicationShortcutItems
  • 動態的快捷操作:需要使用UIApplicationShortcutItem類和相關方法創建快捷操作,並設置UIApplicationshortcutItems的屬性

2. 應用內使用

當用戶按壓時會經歷三個階段:

  • 看看內容預覽是否有效
  • 展示預覽內容
  • present出內容預覽頁面

image: ../Art/preview_available_2_2x.png

image: ../Art/peek_2x.png

image: ../Art/peek_quick_actions_2x.png

3. 使用

  • 檢查3D-Touch是否可用
//通過forceTouchCapability屬性判斷3DTousch是否可用 
//UIForceTouchCapabilityUnknown、UIForceTouchCapabilityUnavailable、UIForceTouchCapabilityAvailable
//實現UITraitEnvironment協議的類都可以直接調用,UIScreen、UIWindow、UIViewController、UIView都實現了該協議
if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){
  NSLog(@"可用");
}

//重寫該方法可以監聽狀態改變改變
- (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection

如果3DTouch不可用需要自己寫 UILongPressGestureRecognizer來代替
  • 主屏幕快捷操作—固定的快捷操作

    需要在Info.plist文件中添加UIApplicationShortcutItems

    這裏寫圖片描述

    UIApplicationShortcutItemType快捷操作的類型,需要這個識別快捷操作

    UIApplicationShortcutItemTitle快捷操作的標題

    UIApplicationShortcutItemSubtitle快捷操作的子標題

    UIApplicationShortcutItemIconType快捷操作的圖標

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      // Override point for customization after application launch.
    //如果程序被殺掉,在這裏拿到快捷操作
      if([[UIDevice currentDevice].systemVersion floatValue] >= 9.0){
    
          UIApplicationShortcutItem *shortcutItem = launchOptions[UIApplicationLaunchOptionsShortcutItemKey];
          if(shortcutItem){
              //根據type判斷要指定哪個操作
          }
      }
      return YES;
    }
    
    //設置完plist文件後需要在appdelegate中重寫該方法
    - (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
    //根據type來判斷執行不同的操作
      if([shortcutItem.type isEqualToString:@"search"]){
          NSLog(@"search");
      }else if([shortcutItem.type isEqualToString:@"open"]){
          NSLog(@"open");
      }
      completionHandler(YES);
    }

  • 主屏幕快捷操作——— 動態的快捷操作

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      // Override point for customization after application launch.
    
      if([[UIDevice currentDevice].systemVersion floatValue] >= 9.0){
    
          UIApplicationShortcutItem *shortcutItem = launchOptions[UIApplicationLaunchOptionsShortcutItemKey];
          if(shortcutItem == nil){
              UIApplicationShortcutItem *firstItem = [[UIApplicationShortcutItem alloc] initWithType:@"first" localizedTitle:@"第一個" localizedSubtitle:@"子標題" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@"sun1"] userInfo:nil];
              UIApplicationShortcutItem *secondItem = [[UIApplicationShortcutItem alloc] initWithType:@"second" localizedTitle:@"第二個" localizedSubtitle:@"子標題" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@"sun2"] userInfo:nil];
              application.shortcutItems = @[firstItem,secondItem];
          }else{
    
              //根據type判斷要指定哪個操作
          }
      }
    
      return YES;
    }
    //自定義圖標需要正方形,單一顏色,35*35的圖纔可以使用
  • 應用內使用

    應用內使用3DTouch需要使用 UIPreviewActionUIPreviewActionGroup類以及 UIPreviewActionItem協議

- (void)viewDidLoad {
    [super viewDidLoad];

    _imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 70, 70)];
    _imgView.center = self.view.center;
    _imgView.image = [UIImage imageNamed:@"sun"];
    _imgView.userInteractionEnabled = YES;
    [self.view addSubview:_imgView];

    //先判斷3DTouch是否可用
    if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){
        //註冊,首先是一個代理,sourceView是你需要將3DTouch加到的view上
        [self registerForPreviewingWithDelegate:self sourceView:_imgView];
    }
}
//實現代理方法
#pragma UIViewControllerPreviewingDelegate
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
    //location是按壓在應用3DTouch視圖上的位置

    //設置sourceRect,應用3DTouch視圖的bounds
    previewingContext.sourceRect = _imgView.bounds;
    //這是需要彈出的controller
    DetailViewController *detailVC = [[DetailViewController alloc] init];
    //預覽是後的大小
    detailVC.preferredContentSize = CGSizeMake(0, 300);

    return detailVC;
}

- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
    //present預覽的controller
    [self showViewController:viewControllerToCommit sender:self];
}



//這是再DetailViewController.m文件中的重寫的,當彈出預覽時,上滑預覽視圖,出現預覽視圖中快捷選項
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {

    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"action1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {

        NSLog(@"action1");
    }];
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"action2" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {

        NSLog(@"action2");
    }];
    UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"action3" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {

        NSLog(@"action3");
    }];

    return @[action1,action2,action3];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章