說明: 最近將以前寫的筆記等內容全部從本地iCloud轉移到SegmentFault上
3D Touch
Apple 自iPhone 6s起支援3D Touch 功能。一個很棒的功能。但其需要藉助硬體支援,所有 6s下的手機都不能實現。呼呼 。作為一名開發者怎麼能被這個難住呢。在實現3D Touch 的學習之前先讓我們的模擬器支援此功能吧,呼呼
3D Touch 實現
3D Touch支援3種模式:
-
peek and pop
在訊息列表頁面按壓會話,則會彈出這個郵件或會話的閱覽,如果繼續施加壓力按壓,則會push出具體的介面實現
-
Home Screen Quick Actions
通過主螢幕的應用Icon,用3D Touch撥出一個選單,進行快速定位到應用功能模組相關功能觸發相關功能
-
Force Properties
peek and pop
此種模式是分為peek 和 pop 兩步的。具體的實現根據使用者的力度不同會分為以下幾步:
-
首先表明內容可以被預覽
-
展示預覽圖 (peek模式)
-
預覽檢視出現導航檢視 (pop 模式)
具體實現步驟
-
首先需要檢測 3D Touch 的可用性
// 檢測3D Touch可用性
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
[self registerForPreviewingWithDelegate:self sourceView:cell];
}
-
控制器遵守UIViewControllerPreviewingDelegate協議並實現代理方法
刺代理只存在兩個代理方法。需要實現這兩個方法才能實現功能
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{
//將觸控點的座標轉化為tableView座標系上的座標點
CGPoint locationBaseTableView = [self.tableView convertPoint:location fromView:[previewingContext sourceView]];
//根據觸控點獲取當前觸控的cell的indexPath
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];
//根據indexPath配置當前需要彈出的控制器,並返回
return VC;
}
此處系統會對其餘部分做虛化處理,可以在以上代理中通過新增一下程式碼實現對虛化部分的控制
// 調整不被虛化的範圍,按壓的那個cell不被虛化(輕輕按壓時周邊會被虛化,再少用力展示預覽,再加力跳頁至設定介面)
// CGRect rect = CGRectMake(0, 0, self.view.frame.size.width,40);
// previewingContext.sourceRect = rect;
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext
commitViewController:(UIViewController *)viewControllerToCommit
{
[self.navigationController pushViewController:viewControllerToCommit animated:YES];
}
以上步驟只是實現了pop和 week 模式,如果需要實現week Action ,那麼需要在被pop控制器中實現一下方法,並返回事件列表
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems{
UIPreviewAction *action = [UIPreviewAction actionWithTitle:@"action" 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");
}];
return @[action, action2];
}
通過touch事件獲取壓力值
//-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// NSArray *arrayTouch = [touches allObjects];
// UITouch *touch = (UITouch *)[arrayTouch lastObject];
touch.force;
//}
Home Screen Quick Actions 實現
此種模式的實現一般有兩種方式新增標籤:
1. 通過plist檔案進行新增
程式啟動起來就可以看到,簡單、直接、明瞭
2. 通過程式碼進行新增
程式必須執行一次才可以看到,需要通過程式碼新增(程式碼必須執行一次才可以)
1. 靜態新增入口標籤
UIApplicationShortcutitems Array
item 0 Distionary
item 1
item 2
每一個item 可以包含以下屬性:
-
UIApplicationShortcutItemType
-
設定一個識別符號字串,用來標識使用者根據那個標籤進入程式
-
必有項
-
-
UIApplicationShortcutItemTitle
-
標籤的標題
-
必有項
-
-
UIApplicationShortcutItemSubtitle
-
副標題
-
-
UIApplicationShortcutItemIconType
-
設定圖示的樣式,使用系統自帶的
-
-
UIApplicationShortcutItemIconFile
-
自定義標籤圖示檔案路徑
-
-
UIApplicationShortcutItemUserInfo
2. 程式碼實現新增標籤
-(void) addShortcutItem {
//使用系統提供的ShortcutIcon型別,
UIApplicationShortcutIcon *addOneIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeAdd];
UIApplicationShortcutItem *addOneItem = [[UIApplicationShortcutItem alloc] initWithType:@"one" localizedTitle:@"第一個" localizedSubtitle:nil icon:addOneIcon userInfo:nil];
//自定義ShortcutIcon
// 如果設定了自定義的icon,那麼系統自帶的就不生效
UIApplicationShortcutIcon *myIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"myImage"];
UIApplicationShortcutItem *myItem = [[UIApplicationShortcutItem alloc] initWithType:@"two" localizedTitle:@"第二個" localizedSubtitle:nil icon:myIcon userInfo:nil];
[UIApplication sharedApplication].shortcutItems = @[addOneItem, myItem];
}
3. 事件處理
#pragma mark 3D Touch
-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
{
//此種方式是通過 type 進行區分, 還可以通過titile 進行區分,一般的title都是不相同的
if ([shortcutItem.type isEqualToString:@"UIApplicationShortcutItemType"]) {
}else if([shortcutItem.type isEqualToString:@""]){
}else {
}
}
參考
-
[官方文件]()