Solution 1:
import UIKit import AudioToolbox class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 这句话会使iPhone产生震动效果,可以加在按钮里面。 AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate)) } }
load onto your phone and it will vibrate. You can put it in a function or IBAction as you wish.
Code Update:
AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }
As apple code docs written:
This function will be deprecated in a future release. Use
AudioServicesPlaySystemSoundWithCompletion instead.
NOTE: If vibrate doesn’t work. check vibrate is enable in sounds and haptics settings
Solution 2:
In iOS 10 on iPhone 7 or 7 Plus, try:
let generator = UIImpactFeedbackGenerator(style: .heavy) generator.impactOccurred()
Solution 3:
Other vibration types:
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)
More About Vibration – http://www.mikitamanko.com/blog/2017/01/29/haptic-feedback-with-uifeedbackgenerator/
Solution 4:
Swift 4.2 Updated
Just insert code below into your project.
Usage
Vibration.success.vibrate()
Source Code
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)) } } }
Solution 5:
For iOS 10.0+ You can try UIFeedbackGenerator
Simple viewController above, just replace your view controller in your test “single view app”
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 } } }