- Published on
SwiftUI-da animatsiya β yangi .animation(value:) usuli (iOS 16+)
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Ko'pchilik oldingi animatsiya videosiga izoh qoldirib, .animation() modifier eski bo'lib qolganini (deprecated) yozdi. Bu videoda yangi usulni va nima uchun Apple buni o'zgartirganligi haqida gaplashamiz.
Muammo β eski .animation() nima uchun muammoli?
Eski usulda .animation() modifier view-dagi barcha o'zgarishlarga qo'llanadi β siz faqat bitta o'zgaruvchi uchun animatsiya istasangiz ham.
// β Eski usul β deprecated (iOS 15+)
Rectangle()
.frame(maxWidth: .infinity, alignment: animateOne ? .leading : .trailing)
.animation(.spring)
Bu holda animateOne ham, animateTwo ham, view-dagi boshqa har qanday o'zgarish ham spring animatsiyasiga ega bo'ladi. Bu kutilmagan animatsiyalar va xatoliklarga olib keladi.
Yechim β yangi .animation(_:value:)
Yangi modifier faqat bitta o'zgaruvchi o'zgarganda animatsiya qiladi:
// β
Yangi usul
Rectangle()
.frame(maxWidth: .infinity, alignment: animateOne ? .leading : .trailing)
.animation(.spring, value: animateOne)
value: parametri β faqat shu o'zgaruvchi o'zgarganda animatsiya ishlaydi.
Amaliy misol β ikki xil animatsiya
Ikkita tugma, ikkita harakat, ikkita alohida animatsiya:
struct AnimationUpdatedBootcamp: View {
@State private var animateOne: Bool = false
@State private var animateTwo: Bool = false
var body: some View {
ZStack {
Color.red.ignoresSafeArea()
VStack(spacing: 40) {
Button("Amal 1") {
animateOne.toggle()
}
Button("Amal 2") {
animateTwo.toggle()
}
}
// Yashil kvadrat β chap/o'ng harakatlanadi
Rectangle()
.frame(width: 100, height: 100)
.background(Color.green)
.frame(maxWidth: .infinity, alignment: animateOne ? .leading : .trailing)
.animation(.spring, value: animateOne)
// To'q sariq kvadrat β yuqori/pastga harakatlanadi
Rectangle()
.frame(width: 100, height: 100)
.background(Color.orange)
.frame(maxHeight: .infinity, alignment: animateTwo ? .top : .bottom)
.animation(.linear(duration: 5), value: animateTwo)
}
}
}
Natija:
- Amal 1 bosilganda β faqat yashil kvadrat spring animatsiyasi bilan chapga/o'ngga siljiydi
- Amal 2 bosilganda β faqat to'q sariq kvadrat 5 soniyalik chiziqli animatsiya bilan yuqoriga/pastga siljiydi
- Ikki animatsiya bir-biriga ta'sir qilmaydi
Eski va yangi usul β taqqoslash
// β Eski β barcha o'zgarishlarga ta'sir qiladi
.animation(.spring)
// β
Yangi β faqat belgilangan o'zgaruvchi o'zgarganda
.animation(.spring, value: animateOne)
Bir nechta animatsiyani birgalikda ishlatish
Rectangle()
.frame(maxWidth: .infinity, alignment: animateOne ? .leading : .trailing)
.frame(maxHeight: .infinity, alignment: animateTwo ? .top : .bottom)
.animation(.spring, value: animateOne) // animateOne uchun
.animation(.linear(duration: 5), value: animateTwo) // animateTwo uchun
Har bir value o'zining animatsiya timingiga ega.
withAnimation haqida
Rasmiy deprecated xabarida withAnimation ham muqobil sifatida ko'rsatilgan. Lekin u ham eski .animation()-ga o'xshash muammolarga ega:
// withAnimation β barcha bog'liq o'zgarishlarni animatsiya qiladi
withAnimation(.spring) {
animateOne.toggle()
}
Tavsiya:
.animation(_:value:)usulini qo'llang β bu eng aniq va boshqarish qulay usul. Faqat kerakli o'zgaruvchi uchun kerakli animatsiyani belgilaysiz.
Xulosa
Bu videoda o'rgandik:
- Eski
.animation()β deprecated (iOS 15+), barcha o'zgarishlarga ta'sir qiladi - Yangi
.animation(_:value:)β faqatvalueo'zgarganda animatsiya ishlaydi - Bir nechta
.animation()ketma-ket qo'llash mumkin β har biri o'z o'zgaruvchisi uchun - Aniqlik β kutilmagan animatsiyalar va xatoliklarni oldini oladi
- Tavsiya:
withAnimationo'rniga ham.animation(_:value:)ishlatish afzal
Rahmat tomosha qilganingiz uchun! Keyingi videoda ko'rishamiz!