3DTouch入門(mén)篇

iPhone6s系列新增了一個(gè)很好玩的3DTouch,筆者稍微參照手機(jī)信息界面做了下入門(mén)的Demo.拋個(gè)磚頭~

知識(shí)點(diǎn):

  • 1.AppIcon深按彈窗
    • plist
    • Appdelegate
  • 2.控制器內(nèi)的Peek和Pop
  • 3.UITouch新增屬性

一. AppIcon深按彈窗

  • 首先,3DTouch出現(xiàn)前我們對(duì)AppIcon的印象:

    • 點(diǎn)擊打開(kāi)應(yīng)用
    • 長(zhǎng)按觸發(fā)應(yīng)用們的編輯形式
  • 現(xiàn)在,在iPhone6S與6S+的機(jī)型上,我們深按它,可以獲得一個(gè)彈窗,用來(lái)快速使用我們應(yīng)用的某些功能
    圖1
  • 如果該彈窗是固定不變的,你可以通過(guò)plist文件直接配置它.

    圖2

其中源碼如下:

<key>UIApplicationShortcutItems</key>
    <array>
        <dict>
            <key>UIApplicationShortcutItemTitle</key>
            <string>titileShare</string>
            <key>UIApplicationShortcutItemSubtitle</key>
            <string>subTitle</string>
            <key>UIApplicationShortcutItemType</key>
            <string>com.mycompany.myapp.openfavorites</string>
            <key>UIApplicationShortcutItemUserInfo</key>
            <dict>
                <key>xmgkey1</key>
                <string>yfvalue1</string>
            </dict>
            <key>UIApplicationShortcutItemIconType</key>
            <string>UIApplicationShortcutIconTypeShare</string>
        </dict>
        <dict>
            <key>UIApplicationShortcutItemTitle</key>
            <string>qq</string>
            <key>UIApplicationShortcutItemSubtitle</key>
            <string>customQQ</string>
            <key>UIApplicationShortcutItemType</key>
            <string>qqtype</string>
            <key>UIApplicationShortcutItemUserInfo</key>
            <dict>
                <key>xmgkey1</key>
                <string>xmgvalue1</string>
            </dict>
            <key>UIApplicationShortcutItemIconFile</key>
            <string>qq</string>
        </dict>
    </array>

其中常用的key有6個(gè),UIApplicationShortcutItemTitleUIApplicationShortcutItemType是必須有的

  • 而如果該彈窗是像信息應(yīng)用那樣顯示其中動(dòng)態(tài)內(nèi)容的話,我們可以通過(guò)代碼實(shí)現(xiàn)它
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    /**
     *
     typedef NS_ENUM(NSInteger, UIApplicationShortcutIconType) {
    UIApplicationShortcutIconTypeCompose,
    UIApplicationShortcutIconTypePlay,
    UIApplicationShortcutIconTypePause,
    UIApplicationShortcutIconTypeAdd,
    UIApplicationShortcutIconTypeLocation,
    UIApplicationShortcutIconTypeSearch,
    UIApplicationShortcutIconTypeShare,
    UIApplicationShortcutIconTypeProhibit       NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeContact        NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeHome           NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeMarkLocation   NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeFavorite       NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeLove           NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeCloud          NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeInvitation     NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeConfirmation   NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeMail           NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeMessage        NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeDate           NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeTime           NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeCapturePhoto   NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeCaptureVideo   NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeTask           NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeTaskCompleted  NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeAlarm          NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeBookmark       NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeShuffle        NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeAudio          NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeUpdate         NS_ENUM_AVAILABLE_IOS(9_1)
} NS_ENUM_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED;
     */

    UIApplicationShortcutIcon *shortcutIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare];
    UIMutableApplicationShortcutItem *mAShortcutItem = [[UIMutableApplicationShortcutItem alloc] initWithType:@"type1"
                                                                                               localizedTitle:@"titile1"
                                                                                            localizedSubtitle:@"localizedSubtitle1"
                                                                                                         icon:shortcutIcon
                                                                                                     userInfo:@{@"userInfo": @"info11"}];
    UIMutableApplicationShortcutItem *mASI = [[UIMutableApplicationShortcutItem alloc] initWithType:@"type2"
                                                                                     localizedTitle:@"title2"
                                                                                  localizedSubtitle:@"localizedSubtitle2"
                                                                                               icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCompose]
                                                                                           userInfo:@{@"icon":@"compose"}];

    // 添加3DTouch元素
    application.shortcutItems =  @[mAShortcutItem, mASI];

    return YES;
}
  • 點(diǎn)擊屏幕主頁(yè)這些彈窗的選項(xiàng),會(huì)觸發(fā)AppDelegate代理方法
swift:
    optional func application(_ application: UIApplication,
performActionForShortcutItem shortcutItem: UIApplicationShortcutItem,
           completionHandler completionHandler: (Bool) -> Void)
OBJECTIVE-C:
- (void)application:(UIApplication *)application
performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
  completionHandler:(void (^)(BOOL succeeded))completionHandler

  // 以動(dòng)態(tài)OC代碼為例

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
{
    NSString *tpye = shortcutItem.type;
    if ([tpye isEqualToString:@"type1"]) { // 分享
        // 處理相關(guān)邏輯
        NSLog(@"跳頁(yè)去分享吧");
        UIViewController *vc = application.keyWindow.rootViewController;

        completionHandler(YES);
    }else if ([tpye isEqualToString:@"type2"]) // 編輯
    {
        NSLog(@"編輯");
        completionHandler(YES);
    }else
    {
        NSLog(@"未知");
        completionHandler(NO);
    }
}

二. 控制器內(nèi)的Peek和Pop

  • 現(xiàn)在在點(diǎn)擊某控制器,也可以使用3DTouch相關(guān)技術(shù)了


    圖3
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    YFHeroCell *cell = [tableView dequeueReusableCellWithIdentifier:@"heroCell"];
    if (!cell) {
        cell = [[YFHeroCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"heroCell"];

        // 判斷控制器是否支持3DTouch
        if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
            // 注冊(cè)支持3DTouch的視圖:cell,并設(shè)置代理
            // @interface ViewController () <UIViewControllerPreviewingDelegate>
            [self registerForPreviewingWithDelegate:self sourceView:cell];
        }
    }


    YFHero *hero = [self.groups[indexPath.section] heros][indexPath.row];
    cell.hero = hero;


    return cell;
}
  • 之后實(shí)現(xiàn)代理方法


    圖5
#pragma mark - UIViewControllerPreviewingDelegate

// 該方法是觸發(fā)的是輕按,中度按壓時(shí)候的場(chǎng)景
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{
    NSLog(@"%s, line = %d, pre = %@, location = %@", __FUNCTION__, __LINE__, previewingContext, NSStringFromCGPoint(location));

    // 拿到sourceView,強(qiáng)轉(zhuǎn)成它原本的類型
    YFHeroCell *cell = (YFHeroCell *)[previewingContext sourceView];
    // 設(shè)置預(yù)覽視圖的位置為原來(lái)的它自己的位置
    [previewingContext setSourceRect:cell.bounds];


    // 創(chuàng)建出現(xiàn)的視圖
    YFDetailController *vc = [[YFDetailController alloc] init];
    vc.preferredContentSize = CGSizeMake(0, 200); // 只能設(shè)置高度,寬度是固定的
    vc.view.backgroundColor = [UIColor greenColor];

    // 設(shè)置控制器內(nèi)的信息
    vc.hero = cell.hero;

    return vc;
}

// 彈窗出現(xiàn)后,再繼續(xù)用力會(huì)進(jìn)行的業(yè)務(wù)邏輯(modal出整個(gè)控制器來(lái))
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(YFDetailController *)viewControllerToCommit
{

    NSLog(@"%s, line = %d, previewingContext = %@, viewControllerToCommit = %@", __FUNCTION__, __LINE__, previewingContext, viewControllerToCommit);
    viewControllerToCommit.showedBackBtn = YES;

    [self presentViewController:viewControllerToCommit animated:YES completion:nil];
    //[self showViewController:viewControllerToCommit sender:[previewingContext sourceView]];
}
  • 彈窗出現(xiàn)后,向上滑動(dòng),會(huì)出現(xiàn)類似于actionSheet的控件


    圖6
    圖7
在detailVc的實(shí)現(xiàn)文件中

// 懶加載創(chuàng)建需要用到的數(shù)組
- (NSArray *)preActions
{
    if (!_preActions) {

        UIPreviewAction *action0 = [UIPreviewAction actionWithTitle:@"action0" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
            NSLog(@"%s, line = %d, action0 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);

        }];

        UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"action1" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
            NSLog(@"%s, line = %d, action1 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);
        }];

        UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"action2" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
            NSLog(@"%s, line = %d, action2 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);
        }];
        UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"action3" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
            NSLog(@"%s, line = %d, action2 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);
        }];


        UIPreviewActionGroup *actionGroup = [UIPreviewActionGroup actionGroupWithTitle:@"actionGroup" style:UIPreviewActionStyleSelected actions:@[action2, action3]];

        _preActions = @[action0, action1, actionGroup];
    }
    return _preActions;
}


// 設(shè)置控制器在彈窗時(shí)候,下面輸出的數(shù)組
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
    return self.preActions;
}
  • webView只需要添加屬性
#warning 核心代碼
    webView.allowsLinkPreview = YES;

三. UITouch

  • 新增屬性force,maximumPossibleForce
// 在控制器中打印,查看其變化
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = touches.anyObject;

    NSLog(@"%s, line = %d, force = %.f,maximumPossibleForce = %.f", __FUNCTION__, __LINE__, touch.force, touch.maximumPossibleForce);
}
  • 可塑性很強(qiáng)大,近期決定按照系統(tǒng)做法封裝一個(gè)3DTouch的第三方
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末热康,一起剝皮案震驚了整個(gè)濱河市衫画,隨后出現(xiàn)的幾起案子摔寨,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異其垄,居然都是意外死亡刷钢,警方通過(guò)查閱死者的電腦和手機(jī)人乓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)勤篮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人色罚,你說(shuō)我怎么就攤上這事碰缔。” “怎么了戳护?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵金抡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我腌且,道長(zhǎng)梗肝,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任铺董,我火速辦了婚禮巫击,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘精续。我一直安慰自己坝锰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布重付。 她就那樣靜靜地躺著顷级,像睡著了一般。 火紅的嫁衣襯著肌膚如雪堪夭。 梳的紋絲不亂的頭發(fā)上愕把,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天拣凹,我揣著相機(jī)與錄音森爽,去河邊找鬼。 笑死嚣镜,一個(gè)胖子當(dāng)著我的面吹牛爬迟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播菊匿,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼付呕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了跌捆?” 一聲冷哼從身側(cè)響起徽职,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佩厚,沒(méi)想到半個(gè)月后姆钉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年潮瓶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陶冷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡毯辅,死狀恐怖埂伦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情思恐,我是刑警寧澤沾谜,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站胀莹,受9級(jí)特大地震影響类早,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗜逻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一涩僻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栈顷,春花似錦逆日、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至靡努,卻和暖如春坪圾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惑朦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工兽泄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漾月。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓病梢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親梁肿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜓陌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件吩蔑、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,095評(píng)論 4 62
  • 1钮热、為什么要學(xué)Markdown? 專注寫(xiě)作烛芬,一邊寫(xiě)一邊排版格式就出來(lái)了隧期,真的很酷炫痴奏,用熟了也不用消耗太多排版腦細(xì)胞...
    littletree閱讀 680評(píng)論 3 9
  • 今日得到 1.花是木本植物開(kāi)的花,草本植物的花叫榮厌秒。 古代管死亡叫化读拆。 焚燒叫焚化,和尚死亡叫坐化鸵闪。 化并不簡(jiǎn)單指...
    Pheeb閱讀 282評(píng)論 0 0
  • 人生往前走的過(guò)程中檐晕,總伴隨著后悔的事。 每過(guò)了一段時(shí)間回顧過(guò)往蚌讼,要么鄙視自己的審美辟灰,這種衣服或者風(fēng)格當(dāng)時(shí)怎么會(huì)追迷...
    聊個(gè)二毛閱讀 176評(píng)論 0 0
  • 本人寶媽一枚,重慶人篡石,現(xiàn)在從事手工diy芥喇,之前玩過(guò)軟陶,串珠凰萨,絲網(wǎng)花继控,發(fā)飾,不織布胖眷,服裝武通,手工包等。夢(mèng)想開(kāi)一個(gè)手工...
    維維手工閱讀 248評(píng)論 0 0