3Dtouch實現

3DTouch分爲三個內容:

1. 在點擊app icon 的手長按並且用力一點,就會出現 幾個Item。

2.(1)在app 裏面長按也要用力往下壓,就會可以彈出一個自定義的 ViewController。這個時候如果你放手了那麼就會消失。

   (2)如果長按往下壓彈出了自定義的ViewController 之後,接着往上移動,就可以出現選擇Action。

3. 如果長按往下壓彈出了自定義的ViewController,然後更加用力一點按壓, 那麼就會相當於push 進來了。

一、主屏靜態和動態快速選項

    1. 在 Info.plist文件裏靜態添加快速選項

先添加了一個UIApplicationShortcutItems的數組,這個數組中添加的元素就是對應的靜態標籤,在每個標籤中我們需要添加一些設置的鍵值:

必填項(下面兩個鍵值是必須設置的):

UIApplicationShortcutItemType   快捷通道類型的字符串,處理點擊事件事時的唯一標識,用於區分item

UIApplicationShortcutItemTitle 這個鍵值設置標籤的標題

選填項(下面這些鍵值不是必須設置的):

UIApplicationShortcutItemSubtitle 設置標籤的副標題

UIApplicationShortcutItemIconType 設置標籤Icon類型

UIApplicationShortcutItemIconFile  設置標籤的Icon文件

UIApplicationShortcutItemUserInfo 設置信息字典(用於傳值)

2.動態添加快速選項

例如:

    UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"icon_register.png"];
    NSDictionary *info1 = @{@"scheme":@"devzeng://register"};
    UIMutableApplicationShortcutItem *item1 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"com.devzeng.registerPage" localizedTitle:@"註冊" localizedSubtitle:@"註冊新用戶" icon:icon1 userInfo:info1];
  NSArray *shortcutItems=[[NSArray alloc]initWithObjects:item1,item2, nil];
  [UIApplication sharedApplication].shortcutItems = shortcutItems;

注:最多可添加4個。

最後,使用這個方法來處理3dtouch點擊事件,包括跳轉至哪個界面

-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler

二、peek (預覽)

彈出懸浮的controller時,按壓事件是加在該controller上的

  1. 首先判斷設備是否支持3DTouch

    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
        {
            NSLog(@"3D Touch  可用!");
        }
        else
        {
            NSLog(@"3D Touch 無效");
        }

  2.  如果支持,則註冊delegate,此處的delegate是UIViewControllerPreviewingDelegate,是按壓controller的代理     

      [self registerForPreviewingWithDelegate:self sourceView:self.view];

    3.實現代理,並做相應的處理,彈出懸浮

       -(UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location

             if ([self.presentedViewController isKindOfClass:[彈出懸浮controller class]]) {
        return nil;
    }
    
    彈出懸浮controller *con = [[彈出懸浮controller alloc] init];
    return con;


    4.添加向上滑動懸浮controller時從底下出來的action,這個是要添加到懸浮controller類裏的

-(NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"收藏" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"click");
    }];
        //想要顯示多個就定義多個 UIPreviewAction
        NSArray *actions = @[action1];
        return actions;
}

三、pop (詳閱)

還是UIViewControllerPreviewingDelegate代理方法,添加在最初按壓的controller上

//全屏展示方法,可有可無,只是加上的話全屏展示時動畫更流暢
-(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
    [self showViewController:viewControllerToCommit sender:self];
}

四、SBShortcutMenuSimulator的安裝和使用

在終端中一次運行如下指令:

1
2
3
git clone https: //github .com /DeskConnect/SBShortcutMenuSimulator .git
cd  SBShortcutMenuSimulator
make

如果電腦中有多個Xcode版本,先做如下操作,如果只有Xcode7,則可以跳過

1
sudo  xcode- select  -switch  /Applications/Xcode2 .app /Contents/Developer/

注意:上面命令中,Xcode2.app是你電腦中Xcode的名字,這裏如要特別注意,如果名字中有空格,需要修改一下,把空格去掉,否則會影響命令的執行。

之後在SBShortcutMenuSimulator的目錄中執行如下操作:

1
2
xcrun simctl spawn booted launchctl debug system /com .apple.SpringBoard --environment DYLD_INSERT_LIBRARIES=$PWD /SBShortcutMenuSimulator .dylib
xcrun simctl spawn booted launchctl stop com.apple.SpringBoard

如果沒有報錯,我們可以通過向指定端口發送消息的方法來在模擬器上模擬3D Touch的效果:

1
echo  'com.apple.mobilecal'   nc  127.0.0.1 8000

其中,com.apple.mobilecal是應用的Bundle ID ,如果要測試我們的應用,將其改爲我們應用的BundleID即可,上面的示例應用是系統日曆:

發佈了41 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章