·前言
前段時間因為對3D Touch感興趣,研究了一下,發現網上的教程很多,很雜亂,所以在此整理一下,弄一個完整的,自己容易看懂的筆記。以便以后用到的時候再花時間去找。
·工具
恩,3D Touch 是需要6s以上的設備支持的,不過呢,技術沒有難題,有牛人在github上為我們提供了一個插件,可以讓我們在模擬器上進行3D Touch的效果測試:
那個,具體用法我這里就不寫了。大家搗鼓搗鼓就出來了。因為我也沒用過??;
ps: 由于本人比較懶,所以可能有些圖就網上盜去了,
·正題
一、在icon處直接響應的功能模塊
我們先來看看效果
ps:這個最多可以設置4個標簽,每個標簽后面可以跟一個圖標
響應icon的有兩種方式
1、在info.plist文件里面配置
這種也叫靜態標簽
我們來看看我是怎樣寫的,話不多說,先直接上圖
先添加了一個UIApplicationShortcutItems的數組,這個數組中添加的元素就是對應的靜態標簽,在每個標簽中我們需要添加一些設置的鍵值:
必填項(下面兩個鍵值是必須設置的):
·UIApplicationShortcutItemType 這個鍵值設置一個快捷通道類型的字符串,用于點擊后響應不同的事件
·UIApplicationShortcutItemTitle 這個鍵值設置標簽的標題
·
選填項(下面這些鍵值不是必須設置的) :
·UIApplicationShortcutItemSubtitle 設置標簽的副標題
·UIApplicationShortcutItemIconFile 設置標簽的Icon文件(也就是圖片)
·UIApplicationShortcutItemUserInfo 設置信息字典(用于傳值)
2、 在代碼里面添加
這種叫動態標簽
/**
type 該item 唯一標識符
localizedTitle :標題
localizedSubtitle:副標題
icon:icon圖標 可以使用系統類型 也可以使用自定義的圖片
userInfo:用戶信息字典 自定義參數,完成具體功能需求
*/
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"item1@3x.png"];
UIApplicationShortcutIcon *cameraIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCompose];
UIApplicationShortcutItem *cameraItem = [[UIApplicationShortcutItem alloc] initWithType:@"item1" localizedTitle:@"拍照" localizedSubtitle:@"" icon:cameraIcon userInfo:nil];
UIApplicationShortcutIcon *shareIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare];
UIApplicationShortcutItem *shareItem = [[UIApplicationShortcutItem alloc] initWithType:@"item2" localizedTitle:@"分享" localizedSubtitle:@"" icon:shareIcon userInfo:nil];
/** 將items 添加到app圖標 */
application.shortcutItems = @[cameraItem,shareItem];
ok,icon的入口我們弄完了。接下來就是是重點
二、響應標簽的行為
其實這玩意兒和推送的原理差不多,都是根據標簽的type來進行相關的邏輯操作。接下來看我的:
首先在AppDelegate里面添加如下方法
- (void)application:(UIApplication *)application
performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
completionHandler:(void(^)(BOOL succeeded))completionHandler
{
}
在上面這個方法里面寫一個UINavigationController
UINavigationController *nav = (UINavigationController *)self.window.rootViewController;
判斷先前我們設置的唯一標識,根據標識符推送到指定的Controller
if([shortcutItem.type isEqualToString:@"one"]){
oneViewController *vc = [[oneViewController alloc] init];
[nav pushViewController:vc animated:YES];
}else if ([shortcutItem.type isEqualToString:@"two"]){
twoViewController *vc = [[twoViewController alloc] init];
[nav pushViewController:vc animated:YES];
}
ok,點擊推送的也就搞定了
三、點擊tableView的cell界面預覽
1、在tableView的代理方法里面加上如下代碼
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
cell.textLabel.text = self.dataSource[indexPath.row];
cell.textLabel.numberOfLines = 0;
// 這里判斷是否支持3D Touch功能
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
NSLog(@"3D Touch 可用!");
//如果支持,給cell注冊3DTouch的peek(預覽)和pop功能
[self registerForPreviewingWithDelegate:self sourceView:cell];
} else {
NSLog(@"3D Touch 無效");
}
return cell;
}
實現代理 UIViewControllerPreviewingDelegate
2、實現UIViewControllerPreviewingDelegate的代理方法
效果圖如下:
// 預覽效果
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{
// 記錄是哪一個cell被按,[previewingContext sourceView]就是按壓的那個視圖
NSIndexPath *index = [self.tableView indexPathForCell:(UITableViewCell *)[previewingContext sourceView]];
// 設定預覽界面
showViewController *showVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"showViewController"];
showVC.titleLabel.text = self.dataSource[index.row];
showVC.preferredContentSize = CGSizeMake(0, 500);
//調整不被虛化的范圍,按壓的那個cell不被虛化(輕輕按壓時周邊會被虛化,再少用力展示預覽,再加力跳頁至設定界面)
CGRect rect = CGRectMake(0, 0, self.view.frame.size.width,40);
previewingContext.sourceRect = rect;
return showVC;
}
// 用力按進入的controller
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
[self showViewController:viewControllerToCommit sender:self];
}
3、在預覽的controller里面設置action
效果圖如下:
直接上代碼
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"第一個" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
// 點擊事件寫到這里
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"第2個" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
}];
UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"第3個" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
}];
UIPreviewAction *action4 = [UIPreviewAction actionWithTitle:@"第4個" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
}];
NSArray *action = @[action1,action2,action3,action4];
return action;
}
- 本文的demo,可以下來看看
- 查閱的這篇博客后,加入了其他博客的東西整理出來的
- 歡迎轉載,但是請注明出處啊,謝謝啊親!
·好了,大概就是這么多了,關于獲取到壓力值的那個東西我正在測試,空閑的時候我會貼上來。
ps 這是個人見解,如果有不對的地方,歡迎留言指出,大家相互探討。謝謝!!