Swift kullanarak iPhone'u nasıl titretebilirim?


116

İPhone'u titretmem gerekiyor ama bunu Swift'de nasıl yapacağımı bilmiyorum. Biliyorum ki Objective-C'de sadece şunu yazıyorsunuz:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Ama bu benim için çalışmıyor.



Burada her .caf ve ilgili kategori için tüm kodları bulacaksınız: github.com/TUNER88/iOSSystemSoundsLibrary Örneğin, daha hafif bir titreşim istiyorsanız 1003 kodunu kullanabilirsiniz.
O. Boujaouane

Yanıtlar:


225

Kısa örnek:

import UIKit
import AudioToolbox

class ViewController: UIViewController {

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

telefonunuza yükleyin ve titreyecektir. İstediğiniz gibi bir fonksiyona veya IBAction'a koyabilirsiniz.

Kod Güncellemesi:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

Apple kod belgelerinin yazdığı gibi:

Bu işlev, gelecekteki bir sürümde kullanımdan kaldırılacaktır. Bunun yerine AudioServicesPlaySystemSoundWithCompletion kullanın.

NOT: Titreşim çalışmazsa. titreşimi kontrol et, sesler ve haptik ayarlarında etkinleştirilir


1
Bir düğmeye basılana kadar telefonun sürekli titremesine izin vermenin bir yolu var mı?
Nicholas

3
Nicholas'ın sorduğu şey, onu özel bir modelde titreştirmenin bir yolu olup olmadığını da merak ediyordum.
Nathan McKaskle

1
Tüm iPhone ses dosyalarının ve titreşim dosyalarının 3'ünün Sistem Kimliğini gösteren bir github olduğunu biliyorum, ancak DİĞER titreşim dosyalarına nasıl erişebileceğimi bilen var mı? Örneğin Staccato titreşimini kullanmak istiyorum, ancak kimliği veya varsa bile kimliğini çözemiyorum.
jammyman34

1
@Nicholas, benden bir düğmeye basmamı isteyen bir uygulama bulursam, aksi halde sonsuza kadar titreyecek, hemen cihazımdan sileceğim.
user3441734

2
Uygulamanızın ses oturumu AVAudioSessionCategoryPlayAndRecord veya AVAudioSessionCategoryRecord ses oturumu kategorisiyle yapılandırıldıysa cihazın titremeyeceğini unutmayın. Bu, titreşimin ses kaydını engellememesini sağlar.
Fede Henze

70

İPhone 7 veya 7 Plus'ta iOS 10'da şunları deneyin:

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

1
hepimiz iOS 10 kullanıyoruz, değil mi? sistemin en yeni, en iyi ve ücretsiz sürümüdür. herkes güncellemeli, buna sahip olmaktan hiçbir ödün yok.
Adam Smaka

13
İOS 10'un ötesinde, bu yalnızca iPhone 7 veya sonraki sürümlerle çalışacak bir özelliktir. İPhone 7'den daha eski cihazlarda göz ardı edilecektir.
C6Silver

@ C6Silver Sen doğrusun. İPhone 4s, 5,5s, 5c ve 6 üzerinde çalışmıyor. Test ettiğim bu cihazlar.
Rocky Balboa


45

Swift 4.2 Güncellendi

Aşağıdaki kodu projenize eklemeniz yeterlidir.

kullanım

Vibration.success.vibrate()

Kaynak kodu

  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
.OldSchool vibrasyon kullanmak için 'import AVFoundation' eklemeyi unutmayın :)
atereshkov

.OldSchool dışında kalan vakalar çalışmıyor iPhone 6 fiziksel cihazında test ettim herhangi bir yardım var mı?
Sai kumar Reddy

FeedbackGenerator'ın dokunsal olduğunu ve iPhone 7 ile birlikte geldiğini açıklamalısınız. Ayrıca her durumda yalnızca bir satırınız olabilir: UIImpactFeedbackGenerator (style: .heavy) .impactOccurred ()
Medhi

22

For iOS 10.0+ Deneyebilirsin UIFeedbackGenerator

Yukarıdaki basit viewController, test "tek görünüm uygulamanızda" görünüm denetleyicinizi değiştirmeniz yeterlidir

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

Bunu Xcode7.1'de yapabiliriz

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()
   } 

Gibi diğer stilleri de seçebilirsiniz

    style: .heavy
    style: .medium

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

4

Ya kullanarak telefon titreşimle olabilir AudioServicesveya Haptic Feedback.

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

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

Benim açık kaynak çerçevesinde Ödeme Haptica , her iki destekler Haptic Feedback, AudioServicesve eşsiz titreşimler kalıpları. Swift 4.2, Xcode 10'da çalışır


3
import AudioToolbox

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

Artık UIDevice.vibrate()gerektiği gibi arayabilirsiniz .


2

UINotificationFeedbackGenerator iOS 10'dan edinilebilir ve Haptic v2 ile çalışır, bunu kontrol edebiliriz:

  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))
        }

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.