- Published on
Xcode loyihasiga ovoz effektlari qo'shish
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Ushbu videoda ilovamizga ovoz effekti (sound effect) qo'shamiz. Mantiq texnik jihatdan SwiftUI emas, balki Swift bilan bog'liq β ammo ilova yaratayotgan har bir dasturchi ovoz effektlarini qo'shishni bilishi kerak.
Ekran tuzilmasi
struct SoundsBootcamp: View {
var body: some View {
VStack(spacing: 40) {
Button("Play Sound 1") {
SoundManager.instance.playSound(sound: .tada)
}
Button("Play Sound 2") {
SoundManager.instance.playSound(sound: .badum)
}
}
}
}
SoundManager va Singleton pattern
Ko'pchilik hollarda klass yaratsak, uni @StateObject bilan view'ga bog'laymiz. Ammo SoundManagerda view'ni yangilaydigan hech narsa yo'q (hech qanday @Published o'zgaruvchi kerak emas), shuning uchun ObservableObjectga moslashtirishimiz shart emas.
Bundan tashqari, har bir ekran uchun yangi SoundManager yaratish ham samarasiz β ovoz menejeri butun ilova bo'ylab bir xil. Buning uchun Singleton (yakka nusxa) pattern ishlatamiz: klass bir marta yaratiladi va barcha joylarda shu bitta nusxa ishlatiladi.
class SoundManager {
static let instance = SoundManager()
// ...
}
static let instance = SoundManager() β bu bitta nusxani yaratadi. Boshqa joylarda SoundManager() emas, SoundManager.instance orqali murojaat qilinadi.
AVKit import qilish
import AVKit
AVKit β Apple tomonidan taqdim etilgan audio va video vositalar to'plami (A = Audio, V = Video). Unga Xcode'da alohida o'rnatish kerak emas β standart holda mavjud.
Enum bilan ovoz variantlarini boshqarish
Har bir ovoz uchun alohida funksiya yaratish o'rniga, enum ishlatamiz. Enumni Stringga moslashtirish orqali, har bir case'ning .rawValuesi β uning nomi (masalan, "tada") bo'ladi, va bu fayl nomiga to'g'ridan-to'g'ri mos keladi:
enum SoundOption: String {
case tada
case badum
}
playSound funksiyasi
import AVKit
class SoundManager {
static let instance = SoundManager()
var player: AVAudioPlayer?
func playSound(sound: SoundOption) {
guard let url = Bundle.main.url(
forResource: sound.rawValue,
withExtension: "mp3"
) else { return }
do {
player = try AVAudioPlayer(contentsOf: url)
player?.play()
} catch let error {
print("Error playing sound: \(error.localizedDescription)")
}
}
}
Qadamlar:
Bundle.main.url(forResource:withExtension:)β fayl nomiga asoslanib URL topadi.sound.rawValueβ enum case'ining string versiyasi (masalan,"tada").guard letβ agar URL topilmasa, funksiyadan chiqib ketamiz.do/try/catchβAVAudioPlayerxato tashlashi mumkin, shuning uchuntryvacatchishlatiladi.player?.play()β ovozni ijro etadi.
Audio fayllarni loyihaga qo'shish
- freesoundslibrary.com yoki boshqa bepul manbaadan
.mp3fayllarni yuklab olasiz. - Fayl nomlarini enum case'iga mos qilib o'zgartiring:
tada.mp3,badum.mp3. - Xcode Navigator'da o'ng tugma β New Group β
Soundsdeb nomlaymiz. - Fayllarni shu guruhga drag & drop qilamiz.
- Ko'rinadigan dialog oynasida:
- β Copy items if needed β fayllarni loyiha ichiga nusxalaydi
- β Create groups
- β Add to target β faylni ilovaga kiritadi (bu belgilanmasa, ijro qilinmaydi)
- "Finish" bosamiz.
Xcode'da fayl ustiga bossangiz, pastdagi "Play" tugmasi bilan ovozni tekshirishingiz mumkin.
Yig'ma kod
// SoundManager.swift
import AVKit
enum SoundOption: String {
case tada
case badum
}
class SoundManager {
static let instance = SoundManager()
var player: AVAudioPlayer?
func playSound(sound: SoundOption) {
guard let url = Bundle.main.url(
forResource: sound.rawValue,
withExtension: "mp3"
) else { return }
do {
player = try AVAudioPlayer(contentsOf: url)
player?.play()
} catch let error {
print("Error playing sound: \(error.localizedDescription)")
}
}
}
// SoundsBootcamp.swift
struct SoundsBootcamp: View {
var body: some View {
VStack(spacing: 40) {
Button("Play Sound 1") {
SoundManager.instance.playSound(sound: .tada)
}
Button("Play Sound 2") {
SoundManager.instance.playSound(sound: .badum)
}
}
}
}
Simulyatorda "Play Sound 1" tugmasini bossak β ta-da ovozi yangraydi, "Play Sound 2" β badum ovozi.
Xulosa
Ushbu videoda qilganlarimiz:
SoundManagerklassini Singleton pattern bilan yaratdik β butun ilova bo'ylab bitta nusxa ishlaydi,SoundManager.instanceorqali murojaat qilinadi.AVKityordamidaAVAudioPlayerbilan ovozni ijro etdik.SoundOptionenum'iniStringga moslashtirdik βrawValueorqali fayl nomiga to'g'ridan-to'g'ri murojaat qilish imkonini oldik.- Audio fayllarni
Bundle.maindan topib,do/try/catchbilan xatolarni boshqardik.
Yangi ovoz qo'shish juda oson: enum'ga yangi case qo'shib, loyihaga mos .mp3 faylni joylash kifoya.