- Published on
SwiftUI-da animatsiyalar
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Oldingi videolarda @State, shartli operatorlar va ternary operatorlarni o'rgandik. Endi shu bilimlarni birlashtirgan holda animatsiyalar yaratamiz.
Animatsiyalar ilovangizga faqat bir necha qator kod bilan professional ko'rinish beradi. Rang, o'lcham, pozitsiya, aylanish — bularning hammasini animatsiya qilish mumkin.
Yangi fayl yaratish
Navigatorda o'ng tugma bosib yangi SwiftUI fayli yarating. Uni AnimationBootcamp deb nomlang va Create tugmasini bosing. Canvas-da Resume bosing.
Boshlang'ich ko'rinish
struct AnimationBootcamp: View {
@State var isAnimated: Bool = false
var body: some View {
VStack {
Button("Tugma") {
isAnimated.toggle()
}
Spacer()
RoundedRectangle(cornerRadius: 25)
.fill(isAnimated ? Color.red : Color.green)
.frame(width: 300, height: 300)
Spacer()
}
}
}
Tugma bosilganda rang o'zgaradi, lekin hozircha darhol o'zgaradi — animatsiyasiz.
withAnimation — animatsiya qo'shish
isAnimated.toggle() o'rniga withAnimation ichida toggle qilsak, o'zgaruvchiga bog'liq barcha o'zgarishlar animatsiya bilan sodir bo'ladi:
Button("Tugma") {
withAnimation(.default) {
isAnimated.toggle()
}
}
Endi rang o'zgarganda silliq o'tish (fade) ko'rinadi.
Bir nechta modifier-ni animatsiya qilish
withAnimation ishga tushganda isAnimated-ga bog'liq barcha modifier-lar animatsiya bilan o'zgaradi. Burchak radiusi, o'lcham va siljishni ham qo'shamiz:
struct AnimationBootcamp: View {
@State var isAnimated: Bool = false
var body: some View {
VStack {
Button("Tugma") {
withAnimation(.default) {
isAnimated.toggle()
}
}
Spacer()
RoundedRectangle(cornerRadius: isAnimated ? 50 : 25)
.fill(isAnimated ? Color.red : Color.green)
.frame(
width: isAnimated ? 100 : 300,
height: isAnimated ? 100 : 300
)
.offset(y: isAnimated ? 300 : 0)
Spacer()
}
}
}
Eslatma:
cornerRadius: 50vaframe: 100x100kombinatsiyasi to'liq doira hosil qiladi — chunki radius o'lchamning yarmi.
Aylanish animatsiyasi — .rotationEffect()
.rotationEffect() modifier-ini .offset()-dan oldin qo'shish kerak. Aks holda siljish ham aylanadi va element ekrandan chiqib ketishi mumkin:
RoundedRectangle(cornerRadius: isAnimated ? 50 : 25)
.fill(isAnimated ? Color.red : Color.green)
.rotationEffect(Angle(degrees: isAnimated ? 360 : 0))
.frame(
width: isAnimated ? 100 : 300,
height: isAnimated ? 100 : 300
)
.offset(y: isAnimated ? 300 : 0)
Endi element aylanib pastga tushadi — yashil to'rtburchakdan qizil doiraga.
Animatsiyani sozlash
.delay() — kechiktirish
Animatsiyani belgilangan soniyaga kechiktiradi:
withAnimation(Animation.default.delay(2)) {
isAnimated.toggle()
}
.repeatCount() — takrorlash soni
withAnimation(
Animation
.default
.repeatCount(5, autoreverses: true)
) {
isAnimated.toggle()
}
autoreverses: true— oldinga va orqaga animatsiya qiladi (har bir yo'nalish bitta hisoblanadi)autoreverses: false— faqat oldinga, keyin darhol qaytib oldingi holatga sakraydi
.repeatForever() — cheksiz takrorlash
Foydalanuvchi ekranda bo'lguncha animatsiya to'xtovsiz davom etadi:
withAnimation(
Animation
.default
.repeatForever(autoreverses: true)
) {
isAnimated.toggle()
}
Ikkinchi usul: .animation() modifier
withAnimation o'rniga animatsiyani to'g'ridan-to'g'ri elementga .animation() modifier sifatida ham qo'shish mumkin:
RoundedRectangle(cornerRadius: isAnimated ? 50 : 25)
.fill(isAnimated ? Color.red : Color.green)
.rotationEffect(Angle(degrees: isAnimated ? 360 : 0))
.frame(
width: isAnimated ? 100 : 300,
height: isAnimated ? 100 : 300
)
.offset(y: isAnimated ? 300 : 0)
.animation(
Animation
.default
.repeatForever(autoreverses: true),
value: isAnimated
)
Bu holda withAnimation kerak emas — tugma oddiy toggle() ishlatadi:
Button("Tugma") {
isAnimated.toggle()
}
withAnimation va .animation() — qaysi birini ishlatish kerak?
withAnimation | .animation() modifier | |
|---|---|---|
| Animatsiya sababi | Tugma yoki voqea | O'zgaruvchi qiymati |
| Ta'sir doirasi | Barcha bog'liq elementlar | Faqat shu element |
| Tavsiya | ✅ Ko'p holatlarda afzal | Faqat bitta elementga kerak bo'lsa |
Tavsiya: aksariyat holatlarda
withAnimationishlatish qulay..animation()modifier element har qanday o'zgarganda — tugmadan tashqari ham — animatsiya qiladi, bu ba'zida kutilmagan natija berishi mumkin.
To'liq kod
struct AnimationBootcamp: View {
@State var isAnimated: Bool = false
var body: some View {
VStack {
Button("Animatsiya") {
withAnimation(
Animation
.default
.repeatCount(5, autoreverses: true)
) {
isAnimated.toggle()
}
}
Spacer()
RoundedRectangle(cornerRadius: isAnimated ? 50 : 25)
.fill(isAnimated ? Color.red : Color.green)
.rotationEffect(Angle(degrees: isAnimated ? 360 : 0))
.frame(
width: isAnimated ? 100 : 300,
height: isAnimated ? 100 : 300
)
.offset(y: isAnimated ? 300 : 0)
Spacer()
}
}
}
Xulosa
Bu videoda o'rgandik:
withAnimation— o'zgaruvchi toggle qilinganda bog'liq barcha elementlarni animatsiya qiladi.animation()modifier — faqat bitta elementga animatsiya qo'shadi.delay()— animatsiyani kechiktiradi.repeatCount()— animatsiyani belgilangan marta takrorlaydi.repeatForever()— animatsiyani cheksiz takrorlaydiautoreverses— animatsiya orqaga qaytsinmi yoki darhol reset bo'lsinmi- Modifier-lar tartibi muhim —
.rotationEffect().offset()-dan oldin kelishi kerak
Keyingi videoda animatsiya tezliklari va turlarini (easeIn, easeOut, spring va boshqalar) o'rganamiz!
Rahmat tomosha qilganingiz uchun! Keyingi videoda ko'rishamiz!