Swift Academy · Lekcja

TimelineView i Canvas do wydajnego rysowania

Renderowanie animacji w czasie rzeczywistym za pomocą harmonogramów TimelineView i API Canvas.

Lekcja 4 z 413 kroki

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 overhead

Dostę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.

Bezpłatny start

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

  1. Animacje niejawne a jawne
  2. matchedGeometryEffect dla przejść typu Hero
  3. Niestandardowy AnimatableModifier i Animatable
  4. TimelineView i Canvas do wydajnego rysowania
← Powrót do Swift Academy