TimelineView i Canvas do wydajnego rysowania
Renderowanie animacji w czasie rzeczywistym za pomocą harmonogramów TimelineView i API Canvas.
TimelineView i Canvas do wydajnego rysowania to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.
Omówienie TimelineView
TimelineView ponownie rysuje zawartość zgodnie z harmonogramem, umożliwiając tworzenie animacji w czasie rzeczywistym bez timerów.
TimelineView(.animation) { timeline in
Text(timeline.date.formatted(date: .omitted, time: .standard))
}Typy TimelineSchedule
Wbudowane harmonogramy: .animation (w każdej klatce), .periodic (w stałym interwale), .explicit (w określonych dniach i godzinach).
TimelineView(.periodic(from: .now, by: 1.0)) { context in
ClockFace(date: context.date)
}Omówienie Canvas
Canvas udostępnia kontekst rysowania 2D do wydajnej grafiki w trybie immediate mode, podobnie jak Core Graphics.
Canvas { ctx, size in
ctx.fill(
Path(ellipseIn: CGRect(origin: .zero, size: size)),
with: .color(.blue)
)
}Rysowanie figur w Canvas
Użyj metod GraphicsContext, takich jak fill, stroke i draw, aby renderować ścieżki i obrazy.
Canvas { ctx, size in
var path = Path()
path.move(to: .zero)
path.addLine(to: CGPoint(x: size.width, y: size.height))
ctx.stroke(path, with: .color(.red), lineWidth: 2)
}Łączenie TimelineView i Canvas
Umieść Canvas wewnątrz TimelineView, aby tworzyć animacje klatka po klatce bez aktualizowania stanu SwiftUI.
TimelineView(.animation) { timeline in
Canvas { ctx, size in
let t = timeline.date.timeIntervalSinceReferenceDate
let x = size.width * (0.5 + 0.4 * cos(t))
let y = size.height * (0.5 + 0.4 * sin(t))
ctx.fill(Path(ellipseIn: CGRect(x: x-10, y: y-10, width: 20, height: 20)), with: .color(.orange))
}
}Rozwiązywanie symboli
Wywołaj ctx.resolve(), aby przekształcić widoki SwiftUI (takie jak Image) w symbole możliwe do rysowania w Canvas.
Canvas { ctx, size in
let symbol = ctx.resolveSymbol(id: "star")!
ctx.draw(symbol, at: CGPoint(x: 50, y: 50))
} symbols: {
Image(systemName: "star.fill").tag("star")
}Tekst i napisy z atrybutami w Canvas
Rysuj tekst za pomocą ctx.draw(Text(...), at:), aby niestandardowo renderować etykiety wewnątrz Canvas.
Canvas { ctx, size in
ctx.draw(
Text("Score: 100").font(.title).foregroundStyle(.white),
at: CGPoint(x: size.width/2, y: 30)
)
}Przekształcenia i przycinanie
Zastosuj przekształcenia afiniczne i ścieżki przycinania do kontekstu graficznego, aby tworzyć złożone efekty.
Canvas { ctx, size in
ctx.translateBy(x: size.width/2, y: size.height/2)
ctx.rotate(by: .degrees(45))
ctx.fill(Path(CGRect(x: -50, y: -50, width: 100, height: 100)), with: .color(.purple))
}Wydajność w porównaniu z widokami SwiftUI
Canvas renderuje całą grafikę w jednym przebiegu rysowania — idealnie nadaje się do systemów cząsteczek lub złożonych wykresów, w przypadku których tysiące widoków działałyby zbyt wolno.
// Benchmark: 500 moving dots
// Canvas: ~120fps on iPhone
// SwiftUI views: ~30fps due to view tree overheadDostępność w Canvas
Zawartość Canvas jest niewidoczna dla VoiceOver. Dodaj etykiety dostępności za pomocą modyfikatora accessibilityChildren.
Canvas { ctx, size in
// draw chart bars
}
.accessibilityChildren {
ForEach(bars) { Text("\($0.label): \($0.value)") }
}Częstotliwość TimelineView
Kontekst udostępnia wskazówkę cadence (na żywo, sekundy, minuty), dzięki czemu można ograniczyć szczegółowość, gdy system jest obciążony.
TimelineView(.animation) { ctx in
if ctx.cadence == .live {
HighDetailAnimation(date: ctx.date)
} else {
LowDetailAnimation(date: ctx.date)
}
}Szybkie sprawdzenie
Który TimelineSchedule powoduje ponowne rysowanie TimelineView w każdej klatce animacji?
Podsumowanie lekcji
TimelineView ponownie rysuje zawartość zgodnie z harmonogramem (w każdej klatce w przypadku .animation). Canvas udostępnia kontekst rysowania 2D w trybie immediate mode. Połącz je, aby wydajnie tworzyć efekty cząsteczkowe, gry i wykresy aktualizowane na żywo bez narzutu różnicowania widoków SwiftUI w każdej klatce.
Ucz się Swift dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 122
- Lekcje
- 409
Często zadawane pytania
Czy lekcja „TimelineView i Canvas do wydajnego rysowania” jest bezpłatna?
Tak — pełny tekst „TimelineView i Canvas do wydajnego rysowania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „TimelineView i Canvas do wydajnego rysowania”?
Renderowanie animacji w czasie rzeczywistym za pomocą harmonogramów TimelineView i API Canvas. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „TimelineView i Canvas do wydajnego rysowania”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Animacje niejawne a jawne
- matchedGeometryEffect dla przejść typu Hero
- Niestandardowy AnimatableModifier i Animatable
- TimelineView i Canvas do wydajnego rysowania