With iOS 9, new iPhone models add a third dimension to the user interface.
- A user can now press your Home screen icon to immediately access functionality provided by your app.
- Within your app, a user can now press views to see previews of additional content and gain accelerated access to features.
模擬器實(shí)現(xiàn)3D Touch功能
1梦皮、插件安裝
插件下載地址:
https://github.com/DeskConnect/SBShortcutMenuSimulator
- 下載插件到本地(在terminal操作):
git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git
- 安裝插件:
cd SBShortcutMenuSimulator
make
2握础、插件使用
- 啟動(dòng)插件
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
注意:如果運(yùn)行過程中出現(xiàn):No devices are booted. 是因?yàn)槟愕哪M器沒有啟動(dòng)垦垂,這時(shí)候啟動(dòng)你的模擬器即可饥悴。
- 預(yù)覽效果
echo 'com.apple.mobilecal' | nc 127.0.0.1 8000
注意:
1竿秆、'com.apple.mobilecal'是應(yīng)用的Bundle ID绍绘,如果你要測(cè)試自己的應(yīng)用的3D Touch效果没卸,將該字段換成自己應(yīng)用的Bundle ID戳晌。上面的示例應(yīng)用是系統(tǒng)日歷泞辐。
2笔横、如果出現(xiàn)SpringBorad意外退出,可能是你的模擬器高于iOS9.1咐吼,可以嘗試下載iOS9.1或iOS9.0的模擬器然后重新以上“插件使用”操作吹缔。
檢測(cè)是否支持3D Touch
- 在UIViewController生命周期的viewWillAppear中做判斷:
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
//3D Touch可用
}
else{
//3D Touch不可用
}
}
UIForceTouchCapability是個(gè)枚舉
@property (nonatomic, readonly) UIForceTouchCapability forceTouchCapability NS_AVAILABLE_IOS(9_0);
typedef NS_ENUM(NSInteger, UIForceTouchCapability) {
UIForceTouchCapabilityUnknown = 0, //3D Touch檢測(cè)失敗
UIForceTouchCapabilityUnavailable = 1, //3D Touch不可用
UIForceTouchCapabilityAvailable = 2 //3D Touch可用
};
- 也可以通過以下方法實(shí)現(xiàn)判斷,當(dāng)界面環(huán)境發(fā)生改變時(shí)會(huì)調(diào)用該方法:
-(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
if (previousTraitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
NSLog(@"3D Touch可用");
}
else{
NSLog(@"3D Touch不可用");
}
}
3D Touch開發(fā)
iOS9提供了四類API(Home Screen Quick Action锯茄、UIKit Peek & Pop 厢塘、WebView Peek & Pop 和UITouch Force Properties)用于操作3D Touch(Pressure Sensitivity 茶没、 Peek and Pop 和 Quick Actions)。
1晚碾、Home Screen Quick Actions
用力按壓主屏幕的應(yīng)用Icon抓半,可以通過3D Touch呼出一個(gè)快捷菜單,點(diǎn)擊快速進(jìn)入相關(guān)功能模塊格嘁。
其中系統(tǒng)自帶的圖片有以下類型:
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;
創(chuàng)建Quick Action有兩種方式:靜態(tài)和動(dòng)態(tài)
-
靜態(tài)創(chuàng)建
靜態(tài)創(chuàng)建只需在Info.plist上添加相關(guān)功能設(shè)置:
也可以右擊Info.plist -> Open As -> Source Code,輸入:
<key>UIApplicationShortcutItems</key>
<array>
<dict>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeSearch</string>
<key>UIApplicationShortcutItemSubtitle</key>
<string>搜索好友</string>
<key>UIApplicationShortcutItemTitle</key>
<string>搜索</string>
<key>UIApplicationShortcutItemType</key>
<string>1</string>
<key>UIApplicationShortcutItemUserInfo</key>
<dict/>
</dict>
<dict>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeAdd</string>
<key>UIApplicationShortcutItemSubtitle</key>
<string>添加好友</string>
<key>UIApplicationShortcutItemTitle</key>
<string>添加</string>
<key>UIApplicationShortcutItemType</key>
<string>2</string>
<key>UIApplicationShortcutItemUserInfo</key>
<dict/>
</dict>
</array>
- 動(dòng)態(tài)創(chuàng)建
代碼創(chuàng)建3D Touch的item:
UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"3" localizedTitle:@"掃一掃"];
UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"3DSearch"];
UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"4" localizedTitle:@"設(shè)置" localizedSubtitle:nil icon:icon userInfo:nil];
[UIApplication sharedApplication].shortcutItems = @[item1,item2];
創(chuàng)建方法:
-(instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle localizedSubtitle:(nullable NSString *)localizedSubtitle icon:(nullable UIApplicationShortcutIcon *)icon userInfo:(nullable NSDictionary *)userInfo NS_DESIGNATED_INITIALIZER;
-(instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle;
設(shè)置圖片方法:
+(instancetype)iconWithType:(UIApplicationShortcutIconType)type;
+(instancetype)iconWithTemplateImageName:(NSString *)templateImageName;笛求。
注意:
(1)系統(tǒng)限制每個(gè)App最多能夠顯示4個(gè)Action Item,其中包括靜態(tài)方式和動(dòng)態(tài)方式進(jìn)行創(chuàng)建的糕簿,超過個(gè)數(shù)不顯示探入。
(2)如果靜態(tài)和動(dòng)態(tài)方式同時(shí)使用的時(shí)候,給UIApplication的shortcutItems賦值的時(shí)候不會(huì)覆蓋靜態(tài)創(chuàng)建的items懂诗。
(3)動(dòng)態(tài)創(chuàng)建的方式只有在程序第一次啟動(dòng)之后才會(huì)顯示蜂嗽。
(4)如果你要顯示系統(tǒng)圖片時(shí),info.plist中不要添加
UIApplicationShortcutItemIconFile屬性殃恒,因?yàn)楫?dāng)
UIApplicationShortcutItemIconFile和UIApplicationShortcutItemIconType同時(shí)存在時(shí)植旧,會(huì)優(yōu)先使用UIApplicationShortcutItemIconFile設(shè)置的圖片。
(5)Quick Actions顯示的icon在左邊或者右邊芋类,這個(gè)是跟你的app 放在你手機(jī)的位置有關(guān)系隆嗅,這個(gè)iOS會(huì)自動(dòng)處理掉。
點(diǎn)擊Home Screen Quick Actions的相應(yīng)回調(diào)
- iOS9新增以下方法實(shí)現(xiàn)點(diǎn)擊 Home Screen Quick Action的相應(yīng)回調(diào)侯繁,我們可以通過shortcutItem的type或者localizedTitle屬性(因?yàn)檫@兩個(gè)屬性時(shí)必須設(shè)置的)判斷點(diǎn)擊了哪個(gè)item:
-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler {
NSInteger index = shortcutItem.type.integerValue;
switch (index) {
case 1:
NSLog(@"搜索");
break;
case 2:
NSLog(@"添加");
break;
case 3:
NSLog(@"掃一掃");
break;
case 4:
NSLog(@"設(shè)置");
break;
default:
break;
}
}
- 還可以通過入口方法里面進(jìn)行判斷(該方法只會(huì)在程序從未啟動(dòng)到啟動(dòng)過程中才會(huì)被調(diào)用):
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (launchOptions) {
UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
NSInteger index = item.type.integerValue;
switch (index) {
case 1:
NSLog(@"搜索");
break;
case 2:
NSLog(@"添加");
break;
case 3:
NSLog(@"掃一掃");
break;
case 4:
NSLog(@"設(shè)置");
break;
default:
break;
}
}
return YES;
}
2胖喳、Peek & Pop
A peek :
Appears while a user presses on an item that supports peek and disappears when the user’s finger lifts
Opens a detailed view of the item—called a pop—when users press a little deeper on the peek view
Can provide quick actions related to the item when users swipe up within the peek view
UIKit Peek & Pop
- 給ViewController上的view注冊(cè)3D Touch(先判斷設(shè)備是否支持3D Touch)
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
{
[self registerForPreviewingWithDelegate:(id)self sourceView:self.view];
}
- 新建一個(gè)新的UIViewController名為:ContentViewController,以便之后peek時(shí)顯示該ContentViewController贮竟,在ContentViewController中重寫以下方法實(shí)現(xiàn)Quick actions:
-(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:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action2");
}];
NSArray *actions = @[action1,action2];
UIPreviewActionGroup *group1 = [UIPreviewActionGroup actionGroupWithTitle:@"Action Group" style:UIPreviewActionStyleDefault actions:actions];
NSArray *array = @[group1];
return array;
}
注意:
1丽焊、該方法不是必須要重寫,根據(jù)自己的需求而定咕别。
2技健、這里是把兩個(gè)action放在了一個(gè)組里顯示,也可以直接顯示兩個(gè)action惰拱。
- ViewController遵循UIViewControllerPreviewingDelegate協(xié)議:
//UIViewControllerPreviewingDelegate
//稍微重按調(diào)用該方法:(peek)
-(UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
//防止重復(fù)加入
if ([self.presentedViewController isKindOfClass:[ContentViewController class]]){
return nil;
}
else {
ContentViewController *contentVC = [[ContentViewController alloc] init];
return contentVC;
}
}
//加重按壓調(diào)用該方法:(pop)
-(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit{
//跳轉(zhuǎn)到某個(gè)ViewController
ContentViewController *contentVC = [[ContentViewController alloc] init];
[self.navigationController pushViewController : contentVC animated:YES];
}
-
效果圖:
peek
Quick actions
點(diǎn)擊Action Group
pop
WebKit Peek & Pop
WebKit Peek & Pop 的操作和UIKit差不多雌贱,只是顯示的是Web網(wǎng)頁。
顯示網(wǎng)頁有三種方法:
1偿短、openUrl離開應(yīng)用進(jìn)入safari打開網(wǎng)頁
2欣孤、UIWebView或者WKWebView自定義視圖在應(yīng)用內(nèi)打開網(wǎng)頁
3、在iOS9.0后新增SFSafariViewController類昔逗,用于顯示web網(wǎng)頁降传。并通過SFSafariViewControllerDelegate的以下方法實(shí)現(xiàn)回到應(yīng)用操作。
-(void)safariViewControllerDidFinish:(SFSafariViewController *)controller{
[controller dismissViewControllerAnimated:YES completion:nil];
}
注意:
1勾怒、方法1不能實(shí)現(xiàn)3D Touch婆排。
2声旺、使用方法2實(shí)現(xiàn)3D Touch時(shí),要設(shè)置屬性 allowsLinkPreview 為Yes(默認(rèn)是NO)段只。
參考文檔
http://pingguohe.net/2015/10/12/3D-Touch-2.html
http://www.devzeng.com/blog/ios9-3d-touch.html