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.