วิธีทำให้ iPhone สั่นโดยใช้ Swift


117

ฉันต้องทำให้ iPhone สั่น แต่ไม่รู้จะทำยังไงใน Swift ฉันรู้ว่าใน Objective-C คุณเพียงแค่เขียน:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

แต่นั่นไม่ได้ผลสำหรับฉัน


Swift มีฟังก์ชันเดียวกันสำหรับคุณ: developer.apple.com/library/ios/documentation/AudioToolbox/…
Martijn Courteaux

ที่นี่คุณจะพบรหัสทั้งหมดสำหรับแต่ละ. caf และหมวดหมู่ที่เกี่ยวข้อง: github.com/TUNER88/iOSSystemSoundsLibraryตัวอย่างเช่นหากคุณต้องการการสั่นสะเทือนที่เบากว่าคุณสามารถใช้รหัส 1003 ได้
O. Boujaouane

คำตอบ:


225

ตัวอย่างสั้น ๆ :

import UIKit
import AudioToolbox

class ViewController: UIViewController {

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

โหลดลงในโทรศัพท์ของคุณและมันจะสั่น คุณสามารถวางไว้ในฟังก์ชันหรือ IBAction ได้ตามที่คุณต้องการ

อัพเดตรหัส:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

ตามที่เขียนเอกสารรหัสแอปเปิ้ล:

ฟังก์ชันนี้จะเลิกใช้งานในอนาคต ใช้ AudioServicesPlaySystemSoundWithCompletion แทน

หมายเหตุ:หากการสั่นไม่ทำงาน ตรวจสอบการสั่นคือเปิดใช้งานในเสียงและการตั้งค่าสัมผัส


1
มีวิธีให้โทรศัพท์สั่นอย่างต่อเนื่องจนกว่าจะกดปุ่มหรือไม่?
Nicholas

3
สิ่งที่นิโคลัสถามฉันก็สงสัยเหมือนกันว่ามีวิธีทำให้มันสั่นในรูปแบบพิเศษหรือไม่
Nathan McKaskle

1
ฉันรู้ว่ามี github ที่แสดงรหัสระบบสำหรับไฟล์เสียง iPhone ทั้งหมดและไฟล์สั่น 3 ไฟล์ แต่มีใครรู้บ้างว่าฉันสามารถเข้าถึงไฟล์สั่นอื่น ๆ ได้อย่างไร ฉันต้องการใช้ Staccato vibrate เป็นต้น แต่ฉันไม่สามารถหา ID หรือแม้ว่าจะมีอยู่ก็ตาม
jammyman34

1
@Nicholas หากฉันพบแอปพลิเคชันที่ขอให้ฉันกดปุ่มมิฉะนั้นมันจะสั่นตลอดฉันจะลบออกจากอุปกรณ์ของฉันทันที
user3441734

2
โปรดทราบว่าอุปกรณ์จะไม่สั่นหากเซสชันเสียงของแอปของคุณได้รับการกำหนดค่าด้วยหมวดหมู่เซสชันเสียง AVAudioSessionCategoryPlayAndRecord หรือ AVAudioSessionCategoryRecord เพื่อให้แน่ใจว่าการสั่นสะเทือนไม่รบกวนการบันทึกเสียง
Fede Henze

70

ใน iOS 10 บน iPhone 7 หรือ 7 Plus ให้ลอง:

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

1
เราทุกคนใช้ iOS 10 ใช่หรือไม่? เป็นระบบใหม่ล่าสุดที่ดีที่สุดและฟรี ทุกคนควรอัปเดตไม่มีการประนีประนอมกับการมี
Adam Smaka

13
นอกเหนือจาก iOS 10 แล้วนี่เป็นเพียงคุณสมบัติที่ใช้งานได้กับ iPhone 7 หรือใหม่กว่า จะถูกละเว้นในอุปกรณ์ที่เก่ากว่า iPhone 7
C6Silver

@ C6Silver คุณคือความจริง มันไม่ทำงานบน iPhone 4s, 5,5s, 5c และ 6 อุปกรณ์เหล่านี้ฉันได้ทดสอบ
Rocky Balboa

52

ประเภทการสั่นสะเทือนอื่น ๆ :

import AudioToolbox

AudioServicesPlaySystemSound(1519) // Actuate "Peek" feedback (weak boom)
AudioServicesPlaySystemSound(1520) // Actuate "Pop" feedback (strong boom)
AudioServicesPlaySystemSound(1521) // Actuate "Nope" feedback (series of three weak booms)

ข้อมูลเพิ่มเติมเกี่ยวกับการสั่นสะเทือน - http://www.mikitamanko.com/blog/2017/01/29/haptic-feedback-with-uifeedbackgenerator/


45

อัปเดต Swift 4.2

เพียงใส่โค้ดด้านล่างลงในโครงการของคุณ

การใช้

Vibration.success.vibrate()

รหัสแหล่งที่มา

  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
อย่าลืมเพิ่ม 'นำเข้า AVFoundation' เพื่อใช้การสั่นสะเทือน. oldSchool :)
atereshkov

ยกเว้น. oldSchool กรณีที่เหลือไม่ทำงานที่ฉันทดสอบในอุปกรณ์จริงของ iPhone 6 ช่วยได้ไหม
Sai kumar Reddy

1
คุณควรอธิบายว่า FeedbackGenerator เป็นแบบสัมผัสและมาพร้อมกับ iPhone 7 คุณสามารถมีได้เพียงบรรทัดเดียวในแต่ละกรณี: UIImpactFeedbackGenerator (style: .heavy) .impactOccurred ()
Medhi

22

สำหรับiOS 10.0+คุณสามารถลองใช้UIFeedbackGenerator

viewController ด้านบนเพียงแค่แทนที่ตัวควบคุมมุมมองในการทดสอบ "แอปมุมมองเดียว"

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

เราสามารถทำได้ใน 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()
   } 

คุณยังสามารถเลือกรูปแบบอื่น ๆ เช่น

    style: .heavy
    style: .medium

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

5

คุณสามารถสั่นโทรศัพท์โดยใช้อย่างใดอย่างหนึ่งหรือAudioServicesHaptic Feedback

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

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

ชำระเงินHapticaเฟรมเวิร์กโอเพนซอร์สของฉันมันรองรับทั้งสองHaptic Feedbackอย่างAudioServicesและรูปแบบการสั่นที่ไม่เหมือนใคร ทำงานบน Swift 4.2, Xcode 10


3
import AudioToolbox

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

ตอนนี้คุณสามารถโทรได้UIDevice.vibrate()ตามต้องการ


2

UINotificationFeedbackGenerator พร้อมใช้งานจาก iOS 10 และทำงานร่วมกับ Haptic v2 เราสามารถตรวจสอบสิ่งนี้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.