Haptic feedback на iPhone 6s

3d_touch_vibration_feedback_7dp7eВ iOS 10 Apple представила API для работы с виброоткликом устройства. К сожалению, этот API работает только на iPhone7 и iPhone 7 Plus. Все остальные устройства этот код просто игнорируют и не выполняют никаких вибраций.
Однако, на iPhone 6s, при использовании 3D Touch, смартфон выполняет виброотклик. Мне стало интересно, можно ли программно вызвать нужный мне паттерн вибрации.

С удивлением обнаружил, что документация по данной теме отсутствует. Стал искать на просторах интернета и нашел весьма элегантное и очень простое решение данной проблемы. Хочу предупредить: среди вариантов, найденных в интернет были такие, которые использовали недокументированные Apple методы. Использование таких методов запрещено для приложений, публикуемых в AppStore. Поэтому от них я отказался сразу и не рассматривал их вообще.
Что касается метода, который будет описан ниже, он тоже не описан в официальной документации, но он не использует никакие незадокументированные методы. Думаю, увидев вариант вызова виброотклика 3D Touch, вы сами поймете принцип вызова.

Программный вызов виброотклика на iPhone 6s

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

При добавлении IBAction в код ViewController, я указывал что событие (Event) у кнопки будет на стандартное Touch Up Inside, которое подставляется автоматически, а  событие Touch Down. Это нужно для того, что бы вызвать метод в момент нажатия на кнопку, а не ее отпускания.  

3d_touch_vibration_feedback_5ga8r

Перед декларацией класса ViewController после импорта UIKit, нужно импортировать Фреймворк  AudioToolbox

//
// proSwift.ru
//

import UIKit
import AudioToolbox

class ViewController: UIViewController {
...

Ну и в итоге для вызова нужного виброотклика нужно вызвать функцию AudioServicesPlaySystemSound().

//
// proSwift.ru
//

AudioServicesPlaySystemSound(1519) // peek

AudioServicesPlaySystemSound(1520) // pop

AudioServicesPlaySystemSound(1521) // nope

Текст ViewController получился таким:

//
// proSwift.ru
//

import UIKit
import AudioToolbox

class ViewController: UIViewController {

    @IBOutlet weak var peek: UIButton!
    @IBOutlet weak var pop: UIButton!
    @IBOutlet weak var nope: UIButton!
    
    private func designFor(button: UIButton) {
        button.layer.cornerRadius = 8
        button.layer.shadowOffset = CGSize(width: 4, height: 4)
        button.layer.shadowRadius = 4
        button.layer.shadowColor = UIColor.black.cgColor
        button.layer.shadowOpacity = 0.6
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        designFor(button: peek)
        designFor(button: pop)
        designFor(button: nope)
   }
    
    @IBAction func peekHandler(_ sender: UIButton) {
        AudioServicesPlaySystemSound(1519)
    }
    
    @IBAction func popHandler(_ sender: UIButton) {
        AudioServicesPlaySystemSound(1520)
    }
    
    @IBAction func nopeHandler(_ sender: UIButton) {
        AudioServicesPlaySystemSound(1521)
    }
}

Запустите приложение на реальном устройстве и поднажимайте на кнопки. Вы почувствуете три интегрированных паттерны виброоткликов.

Ссылка проект на gitHub.



Метки:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.