Прокрутка 3D Touch Peek Like Mail

Используя функциональность 3D Touch Peek и Pop, какой наиболее эффективный способ имитировать возможности, описанные ниже (проведите по экрану "подсмотренное" содержимое, чтобы выполнить действие)? Снимок экрана приведен из исходного приложения iOS для iOS.

Mail Swipe 3D Touch - непрочитанный Mail Swipe 3D Touch - Корзина

Ответ 1

Обновление

Вы можете воспроизвести этот эффект на iOS 10. Там появился новый набор API, называемый UIPreviewInteraction и UIPreviewInteractionDelegate, которые позволяют настраивать презентацию для взаимодействия peek/pop. Я настоятельно рекомендую смотреть Peek at 3D Touch с этого года WWDC.

Оригинальный ответ

Глядя на iOS Runtime Headers, есть класс под названием UIPreviewPresentationController. То, что диспетчер отвечает за peeks. Внутри него есть ссылки на объекты с именем leadingPreviewAction и trailingPreviewAction. Они имеют соответствующие свойства, которые касаются краевых ограничений и центров. Судя по использованию терминов, ведущих и завершающих (как в Auto Layout), они могут соответствовать элементам действия влево/вправо.

Это предположение, но я думаю, что эти связанные частные классы (_UIPreviewQuickActionView) контролируют поведение, которое вы ищете. Сейчас они недоступны.

Аналогично, в документации для UIPreviewAction говорится:

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

Ответ 2

Чтобы использовать быстрые действия Peek, ваш detailledViewControler (или то, что вы назвали его) должен переопределить previewActionItems следующим образом:

lazy var previewActions: [UIPreviewActionItem] = {
        func previewActionForTitle(title: String, style: UIPreviewActionStyle = .Default) -> UIPreviewAction {
            return UIPreviewAction(title: title, style: style) { previewAction, viewController in
                guard let detailViewController = viewController as? DetailViewController,
                          item = detailViewController.detailItemTitle else { return }

                print("\(previewAction.title) triggered from `DetailViewController` for item: \(item)")
            }
        }

        let action1 = previewActionForTitle("Default Action")
        let action2 = previewActionForTitle("Destructive Action", style: .Destructive)

        let subAction1 = previewActionForTitle("Sub Action 1")
        let subAction2 = previewActionForTitle("Sub Action 2")
        let groupedActions = UIPreviewActionGroup(title: "Sub Actions…", style: .Default, actions: [subAction1, subAction2] )

        return [action1, action2, groupedActions]
    }()


override func previewActionItems() -> [UIPreviewActionItem] {
    return previewActions
}

Здесь вы можете найти весь код: https://developer.apple.com/library/ios/samplecode/ViewControllerPreviews/ViewControllerPreviewsUsingtheUIViewControllerpreviewingAPIs.zip