Bagaimana cara membuat iPhone bergetar menggunakan Swift?


116

Saya perlu membuat iPhone bergetar, tetapi saya tidak tahu cara melakukannya di Swift. Saya tahu bahwa di Objective-C, Anda cukup menulis:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Tapi itu tidak berhasil untuk saya.



Di sini Anda akan menemukan semua kode untuk setiap .caf dan kategori terkait: github.com/TUNER88/iOSSystemSoundsLibrary Misalnya jika Anda menginginkan getaran yang lebih ringan, Anda dapat menggunakan kode 1003.
— O. Boujaouane

Jawaban:


225

Contoh singkat:

import UIKit
import AudioToolbox

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))            
    }
}

memuat ke ponsel Anda dan itu akan bergetar. Anda dapat memasukkannya ke dalam fungsi atau IBAction sesuai keinginan.

Pembaruan Kode:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

Seperti yang tertulis dalam dokumen kode apel:

Fungsi ini tidak akan digunakan lagi di rilis mendatang. Gunakan AudioServicesPlaySystemSoundWithCompletion sebagai gantinya.

CATATAN: Jika getar tidak berfungsi. periksa getar diaktifkan di pengaturan suara dan haptics


1
adakah cara untuk membiarkan ponsel bergetar terus menerus hingga tombol ditekan?
— Nicholas

3
Apa yang ditanyakan Nicholas, juga saya bertanya-tanya apakah ada cara untuk membuatnya bergetar dalam beberapa pola khusus.
— Nathan McKaskle

1
Saya tahu ada github yang menunjukkan ID Sistem untuk semua file audio iPhone dan 3 file getar, tetapi adakah yang tahu bagaimana saya dapat mengakses file getar LAINNYA? Saya ingin menggunakan getaran Staccato misalnya, tetapi saya tidak tahu ID-nya, atau bahkan jika ada.
— jammyman34

1
@Nicholas jika saya menemukan aplikasi yang meminta saya untuk menekan tombol, jika tidak maka akan bergetar selamanya, saya akan segera menghapusnya dari perangkat saya.
— pengguna3441734

2
Perlu diingat bahwa perangkat tidak bergetar jika sesi audio aplikasi Anda dikonfigurasi dengan kategori sesi audio AVAudioSessionCategoryPlayAndRecord atau AVAudioSessionCategoryRecord. Ini memastikan bahwa getaran tidak mengganggu perekaman audio.
— Fede Henze

70

Di iOS 10 pada iPhone 7 atau 7 Plus, coba:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()

1
kita semua menggunakan iOS 10, bukan? ini adalah versi sistem yang terbaru, terbaik, dan gratis. setiap orang harus memperbarui, tidak ada kompromi untuk memilikinya.
— Adam Smaka

13
Di luar iOS 10, ini hanya fitur yang akan berfungsi dengan iPhone 7 atau lebih baru. Ini akan diabaikan pada perangkat yang lebih tua dari iPhone 7.
— C6Silver

@ C6 Anda benar. Tidak berfungsi pada iPhone 4s, 5,5s, 5c dan 6. Perangkat ini telah saya uji.
— Rocky Balboa


45

Swift 4.2 Diperbarui

Cukup masukkan kode di bawah ini ke dalam proyek Anda.

Pemakaian

Vibration.success.vibrate()

Kode sumber

  enum Vibration {
        case error
        case success
        case warning
        case light
        case medium
        case heavy
        @available(iOS 13.0, *)
        case soft
        @available(iOS 13.0, *)
        case rigid
        case selection
        case oldSchool

        public func vibrate() {
            switch self {
            case .error:
                UINotificationFeedbackGenerator().notificationOccurred(.error)
            case .success:
                UINotificationFeedbackGenerator().notificationOccurred(.success)
            case .warning:
                UINotificationFeedbackGenerator().notificationOccurred(.warning)
            case .light:
                UIImpactFeedbackGenerator(style: .light).impactOccurred()
            case .medium:
                UIImpactFeedbackGenerator(style: .medium).impactOccurred()
            case .heavy:
                UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
            case .soft:
                if #available(iOS 13.0, *) {
                    UIImpactFeedbackGenerator(style: .soft).impactOccurred()
                }
            case .rigid:
                if #available(iOS 13.0, *) {
                    UIImpactFeedbackGenerator(style: .rigid).impactOccurred()
                }
            case .selection:
                UISelectionFeedbackGenerator().selectionChanged()
            case .oldSchool:
                AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
            }
        }
    }

4
Jangan lupa untuk menambahkan 'impor AVFoundation' untuk menggunakan getaran .oldSchool :)
— atereshkov

Kecuali .oldSchool sisa kasus tidak berfungsi Saya menguji di iPhone 6 perangkat fisik ada bantuan?
— Sai kumar Reddy

Anda harus menjelaskan bahwa FeedbackGenerator haptic dan disertakan dengan iPhone 7. Anda juga hanya dapat memiliki satu baris untuk setiap kasus: UIImpactFeedbackGenerator (style: .heavy) .impactOccurred ()
— Medhi

22

Untuk iOS 10.0+ Anda dapat mencoba UIFeedbackGenerator

ViewController sederhana di atas, cukup ganti pengontrol tampilan Anda dalam pengujian "aplikasi tampilan tunggal"

import UIKit

class ViewController: UIViewController {

    var i = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        let btn = UIButton()
        self.view.addSubview(btn)
        btn.translatesAutoresizingMaskIntoConstraints = false

        btn.widthAnchor.constraint(equalToConstant: 160).isActive = true
        btn.heightAnchor.constraint(equalToConstant: 160).isActive = true
        btn.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        btn.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

        btn.setTitle("Tap me!", for: .normal)
        btn.setTitleColor(UIColor.red, for: .normal)
        btn.addTarget(self, action: #selector(tapped), for: .touchUpInside)
    }

    @objc func tapped() {
        i += 1
        print("Running \(i)")

        switch i {
        case 1:
            let generator = UINotificationFeedbackGenerator()
            generator.notificationOccurred(.error)

        case 2:
            let generator = UINotificationFeedbackGenerator()
            generator.notificationOccurred(.success)

        case 3:
            let generator = UINotificationFeedbackGenerator()
            generator.notificationOccurred(.warning)

        case 4:
            let generator = UIImpactFeedbackGenerator(style: .light)
            generator.impactOccurred()
        case 5:
            let generator = UIImpactFeedbackGenerator(style: .medium)
            generator.impactOccurred()

        case 6:
            let generator = UIImpactFeedbackGenerator(style: .heavy)
            generator.impactOccurred()

        default:
            let generator = UISelectionFeedbackGenerator()
            generator.selectionChanged()
            i = 0
        }
    }
}

18

Kami dapat melakukan ini di Xcode7.1

import UIKit
import AudioToolbox


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
    }
}

12

Swift 4.2, 5.0

 if #available(iOS 10.0, *) {
      UIImpactFeedbackGenerator(style: .light).impactOccurred()
   } 

Anda juga dapat memilih gaya lain seperti

    style: .heavy
    style: .medium

    //Note: soft and rigid available in only iOS 13.0
    style: .soft
    style: .rigid

4

Anda dapat menggetarkan telepon menggunakan AudioServicesatau Haptic Feedback.

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

// Haptic Feedback
UIImpactFeedbackGenerator(style: .medium).impactOccurred()

Lihat kerangka kerja sumber terbuka saya Haptica , ini mendukung keduanya Haptic Feedback, AudioServicesdan pola getaran unik. Berfungsi pada Swift 4.2, Xcode 10


3
import AudioToolbox

extension UIDevice {
    static func vibrate() {
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
    }
}

Sekarang Anda bisa menelepon UIDevice.vibrate()sesuai kebutuhan.


2

UINotificationFeedbackGenerator tersedia dari iOS 10 dan berfungsi dengan Haptic v2, kita dapat memeriksanya:

  let feedbackSupportLevel = UIDevice.current.value(forKey: "_feedbackSupportLevel") as? Int
        if #available(iOS 10.0, *), let feedbackSupportLevel = feedbackSupportLevel, feedbackSupportLevel > 1 {
            do { // 1
                let generator = UIImpactFeedbackGenerator(style: .medium)
                generator.impactOccurred()
            }

            do { // or 2
                let generator = UINotificationFeedbackGenerator()
                generator.notificationOccurred(.success)
            }
        } else {
            AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
        }

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.