Статьи

iOS 9: введение в 3D Touch

С iPhone 6s и 6s Plus Apple представила совершенно новый способ взаимодействия с нашими устройствами под названием 3D Touch. 3D Touch работает, определяя величину давления, которое вы прикладываете к экрану вашего телефона для выполнения различных действий. В этом уроке я собираюсь показать вам, как использовать преимущества 3D Touch, чтобы вы могли использовать эту новую технологию в своих собственных приложениях для iOS 9.

Это руководство требует, чтобы вы работали с Xcode 7.1 или новее. На момент написания статьи iOS Simulator еще не поддерживал 3D Touch, что означает, что любое тестирование необходимо проводить на физическом устройстве, iPhone 6s или iPhone 6s Plus. Если вы хотите продолжить, загрузите стартовый проект с GitHub.

В этом первом разделе я покажу вам, как реализовать функциональность Peek and Pop в вашем приложении с использованием раскадровок и небольшого количества кода. Если вы не знаете, что такое Peek и Pop, это, по сути, способ нажать на элемент пользовательского интерфейса с чуть большей силой, чтобы получить «Peek».

В таком предварительном просмотре вы можете либо поднять палец, чтобы закрыть его, либо нажать немного сильнее, чтобы «выскочить» на весь экран. «Peekable» элементы могут быть любым контроллером представления, включая такие вещи, как электронная почта, сообщения и веб-страницы, как показано на скриншоте ниже.

Заглянуть на веб-страницу

Откройте стартовый проект в Xcode и перейдите к Main.storyboard . Уменьшите раскадровку, нажав на трекпад или нажав Ctrl + — . Выберите последовательность, показанную на следующем скриншоте.

Выбранный Segue

Выбрав этот переход, откройте Атрибуты Инспектор и искать новый раздел под названием Peek and Pop . Установите флажок и настройте поведение, как показано ниже.

Peek и Pop варианты

В этом меню вы можете назначить пользовательские идентификаторы для сегментов Peek ( Preview ) и Pop ( Commit ). В коммите segue также есть опции для настройки всего, что вы можете для регулярного перехода в раскадровках, таких как Class , Module и Kind .

Создайте и запустите приложение на своем iPhone и нажмите кнопку « в верхнем правом углу, чтобы создать новый элемент.

Новый предмет создан

Сильно нажмите на элемент, и вы увидите, что мы получаем предварительный просмотр контроллера подробного представления для этого элемента.

Предварительный просмотр товара

Вы увидите, что наш подробный вид пока не показывает правильные данные для элемента, который мы просматриваем. Это связано с тем, что мы еще не настроили представление для пользовательского сегмента предварительного просмотра, который мы определили в раскадровке. Вернувшись в свой проект, откройте MasterViewController.swift и замените метод prepareForSegue(_:sender:) следующей реализацией:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == «showDetail» {
        if let indexPath = self.tableView.indexPathForSelectedRow {
            let object = objects[indexPath.row] as!
            let controller = (segue.destinationViewController as! UINavigationController).topViewController as!
            controller.detailItem = object
            controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
            controller.navigationItem.leftItemsSupplementBackButton = true
        }
    } else if let cell = sender as?
        let controller = (segue.destinationViewController as! UINavigationController).topViewController as!
        controller.detailItem = cell.textLabel?.text
        controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
        controller.navigationItem.leftItemsSupplementBackButton = true
    }
}

Первое утверждение if остается без изменений. Если этот код не выполняется, мы проверяем, является ли отправитель UITableViewCell а идентификатор "showDetailPeek" равен "showDetailPeek" . Если оба эти условия выполнены, мы настраиваем detailItem на текст ячейки.

Создайте и запустите приложение снова. На этот раз при просмотре элемента вы должны получить правильно настроенный предварительный просмотр, как показано ниже.

Правильный просмотр предмета

Важно отметить, что эти конфигурации раскадровки для Peek и Pop будут работать только на устройствах под управлением iOS 9.1 или более поздней версии. Для поддержки устройств под управлением iOS 9.0 вам необходимо настроить функциональность Peek and Pop в коде, как показано в следующем разделе.

Хотя это немного сложнее, чем настройка раскадровки, программная реализация Peek и Pop также позволяет добавлять дополнительные действия в предварительный просмотр, когда пользователь проводит пальцем вверх. Посмотрите на следующий скриншот, чтобы лучше понять, что я имею в виду.

Предварительный просмотр действий

Peek and pop обрабатывается в коде протоколом UIViewControllerPreviewingDelegate . В своем проекте создайте новый iOS> Source> Swift File и назовите его MasterPreviewing .

Swift исходный файл

Добавьте следующий код в MasterPreviewing.swift :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
import UIKit
 
extension MasterViewController: UIViewControllerPreviewingDelegate {
    func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController?
        guard let viewController = self.storyboard?.instantiateViewControllerWithIdentifier(«forceViewController») as?
         
        viewController.preferredContentSize = CGSize(width: 0, height: 0)
         
        return viewController
    }
     
    func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
        showViewController(viewControllerToCommit, sender: self)
    }
}

Мы делаем класс MasterViewController соответствующим протоколу UIViewControllerPreviewingDelegate .

В методе previewingContext(_:viewControllerForLocation:) мы создаем экземпляр ForceViewController из раскадровки и возвращаем этот объект. Свойство preferredContentSize определяет, насколько большим будет предварительный просмотр на экране. Когда используется размер (0, 0) , предварительный просмотр автоматически становится настолько большим, насколько это возможно для текущего экрана.

В методе previewingContext(_:commitViewController:) мы завершаем переход от экземпляра MasterViewController и ForceViewController мы создали на этапе Peek на экране.

Чтобы использовать этот новый код, нам также нужно зарегистрировать определенные представления, для которых мы хотим создать предварительный просмотр, когда они будут активны. Для этого откройте MasterViewController.swift и добавьте следующий код в viewDidLoad() :

1
2
3
if traitCollection.forceTouchCapability == .Available {
    self.registerForPreviewingWithDelegate(self, sourceView: forceButton)
}

Сначала мы проверим, доступно ли 3D Touch на устройстве (API называется Force Touch). Если это так, мы регистрируем forceButton (тот, что внизу таблицы) как подходящее представление для Peek и Pop с.

Наконец, чтобы добавить действия в предварительный просмотр, вам нужно определить их в предварительном просмотре.   просмотр класса контроллера. Откройте ForceViewController.swift и добавьте следующий метод в класс:

01
02
03
04
05
06
07
08
09
10
11
12
13
override func previewActionItems() -> [UIPreviewActionItem] {
    let regularAction = UIPreviewAction(title: «Regular», style: .Default) { (action: UIPreviewAction, vc: UIViewController) -> Void in
         
    }
     
    let destructiveAction = UIPreviewAction(title: «Destructive», style: .Destructive) { (action: UIPreviewAction, vc: UIViewController) -> Void in
         
    }
     
    let actionGroup = UIPreviewActionGroup(title: «Group…», style: .Default, actions: [regularAction, destructiveAction])
     
    return [regularAction, destructiveAction, actionGroup]
}

Мы создаем три действия для отображения с предварительным просмотром ForceViewController . Первый — это регулярное действие и самый распространенный. Когда выбрано это действие, будет выполнен (на данный момент пустой) блок кода, который вы определили при создании действия. Второе — это разрушительное действие, которое будет действовать точно так же, как и первое, но оно будет отображаться красным на экране предварительного просмотра. Наконец, мы создаем группу действий, которая сворачивает любое количество других действий под одной кнопкой.

Создайте и запустите ваше приложение еще раз. На этот раз нажмите кнопку Force , чтобы увидеть новый ForceViewController просмотр ForceViewController как показано ниже.

Предварительный просмотр

Проведите вверх по этому предварительному просмотру, чтобы увидеть действия, которые мы определили в классе ForceViewController .

Принудительное предварительное действие

Наконец, нажмите действие Группа …, чтобы открыть действия, содержащиеся в этой группе.

Принудительный предварительный просмотр действий из группы

На устройствах, совместимых с 3D Touch, класс UITouch также получает некоторые новые функциональные возможности в виде двух новых свойств, force и maximumPossibleForce . Эти свойства очень полезны для любого случая использования, когда вы хотите точно измерить, какое давление прикладывается к экрану.

Начните с добавления следующего метода в класс ForceViewController :

1
2
3
4
5
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first where traitCollection.forceTouchCapability == .Available {
        self.forceOutput.text = «\(touch.force)\n\(touch.maximumPossibleForce)»
    }
}

Мы обнаруживаем всякий раз, когда касание экрана движется, в том числе к экрану и от него. Мы извлекаем текущую силу, примененную из первого объекта UITouch в наборе, и отображаем значения на экране.

Создайте и запустите свое приложение и нажмите кнопку Force , чтобы открыть ForceViewController . Нажмите в любом месте экрана с различными величинами давления, и вы увидите, что метка на экране обновится соответственно, чтобы показать текущее приложенное усилие, а также максимальное усилие, которое может быть применено.

Обнаруженная сила

Обратите внимание, что эти значения не связаны с какими-либо физическими единицами и не зависят от настроек чувствительности 3D-касания пользователя. Значение 1,0 представляет силу, приложенную к среднему прикосновению.

В дополнение к новым функциям в приложении, которые предлагает 3D Touch, вы также можете добавить до четырех ярлыков для определенных функций вашего приложения на значок приложения. К этим быстрым действиям можно получить доступ, когда пользователь глубоко нажмет на значок вашего приложения на домашнем экране, как показано на следующем снимке экрана.

Safari быстрых действий

Существует два основных типа быстрых действий, которые вы можете создать для своего приложения: статические и динамические . Статические быстрые действия определены в Info.plist вашего приложения и всегда доступны для вашего приложения. Динамические быстрые действия создаются в вашем коде и добавляются в общий объект UIApplication для вашего приложения.

Для нашего приложения мы собираемся создать как статическое, так и динамическое быстрое действие, которое будет иметь точно такую ​​же реализацию, добавляя новый элемент в табличное представление. Он покажет вам, как использовать оба типа действий в ваших собственных приложениях.

Быстрые действия представлены новым классом UIApplicationShortcutItem , который имеет следующие свойства:

  • localizedTitle — основной заголовок быстрого действия (например, « Новая вкладка» на скриншоте выше)
  • localizedSubtitle — необязательный субтитр для быстрого действия, который отображается под основным заголовком.
  • type уникальный строковый идентификатор для использования, чтобы определить, какое быстрое действие было выбрано
  • icon необязательный объект UIApplicationShortcutIcon который может отображать предоставленный системой значок или пользовательское изображение
  • userInfo — необязательный словарь, который полезен для быстрого сопоставления данных

Во-первых, мы собираемся создать статическое быстрое действие. Откройте файл Info.plist цели и добавьте следующие элементы в точности так, как показано на скриншоте ниже:

Сочетания клавиш

Обратите внимание, что ключ UIApplicationShortcutItemIconType можно поменять местами с ключом UIApplicationShortcutItemIconFile, причем значением будет имя файла изображения, которое вы хотите использовать. Предоставленное нами значение UIApplicationShortcutItemUserInfo также является просто базовым примером словаря, который покажет вам, как вы можете настроить свои собственные пользовательские данные.

Далее мы собираемся создать динамическое действие. Откройте MasterViewController.swift и добавьте следующие две строки кода в метод viewDidLoad() :

1
2
let shortcut = UIApplicationShortcutItem(type: «com.tutsplus.Introducing-3D-Touch.add-item», localizedTitle: «Add Item», localizedSubtitle: «Dynamic Action», icon: UIApplicationShortcutIcon(type: .Add), userInfo: nil)
UIApplication.sharedApplication().shortcutItems = [shortcut]

Точно так же вы создали как статическое, так и динамическое быстрое действие для своего приложения.

Наконец, нам нужно разобраться с логикой нашего приложения, когда эти быстрые действия фактически выбираются на главном экране. Это обрабатывается приложением вашего делегата application(_:performActionForShortcutItem:completionHandler:) . Откройте AppDelegate.swift и добавьте следующий метод в класс AppDelegate :

01
02
03
04
05
06
07
08
09
10
11
12
func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
    if shortcutItem.type == «com.tutsplus.Introducing-3D-Touch.add-item» {
        let splitViewController = self.window!.rootViewController as!
        let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as!
        let masterViewController = navigationController.viewControllers[0] as!
        masterViewController.insertNewObject(UIButton())
         
        completionHandler(true)
    }
     
    completionHandler(false)
}

Сначала мы проверяем тип быстрого действия, а затем MasterViewController доступ к объекту MasterViewController . Для этого объекта мы вызываем метод insertNewObject(_:) чтобы вставить новый элемент в табличное представление. Обратите внимание, что этот метод предоставляется iOS> Приложение> Шаблон приложения Master-Detail и требует параметр AnyObject . Однако этот параметр не используется в реальной реализации метода и может быть любым объектом. Наконец, мы вызываем completionHandler с логическим значением, чтобы сообщить системе, было ли быстрое действие выполнено успешно.

Создайте и запустите ваше приложение в последний раз. После загрузки перейдите на домашний экран устройства и нажмите на значок приложения. Вы увидите, что для вашего приложения доступны два быстрых действия.

Приложение быстрых действий

Затем нажмите на любой из них, и ваше приложение должно открыться с новым элементом, добавленным в представление таблицы.

Новый элемент добавлен через ярлык

Теперь вы должны чувствовать себя комфортно с API 3D Touch, доступными в iOS 9, включая Peek и Pop, обнаружение силы с помощью UITouch и быстрые действия на домашнем экране. 3D Touch предлагает множество новых способов взаимодействия с вашим устройством, и я настоятельно рекомендую всем принять его в свои приложения.

Как всегда, вы можете оставить свои комментарии и отзывы ниже.