TimelineView และ Canvas สำหรับการวาดประสิทธิภาพสูง
แสดงผลแอนิเมชันแบบเรียลไทม์ด้วยตารางเวลาของ TimelineView และ API ของ Canvas
TimelineView และ Canvas สำหรับการวาดประสิทธิภาพสูง เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
ภาพรวมของ TimelineView
TimelineView จะวาดเนื้อหาใหม่ตามกำหนดการ ทำให้สร้างแอนิเมชันแบบเรียลไทม์ได้โดยไม่ต้องใช้ตัวจับเวลา
TimelineView(.animation) { timeline in
Text(timeline.date.formatted(date: .omitted, time: .standard))
}ประเภทของ TimelineSchedule
กำหนดการในตัวมีดังนี้: .animation (ทุกเฟรม), .periodic (ช่วงเวลาคงที่) และ .explicit (วันที่ที่ระบุไว้)
TimelineView(.periodic(from: .now, by: 1.0)) { context in
ClockFace(date: context.date)
}ภาพรวมของ Canvas
Canvas มีบริบทการวาดภาพแบบ 2 มิติสำหรับกราฟิกโหมดทันทีประสิทธิภาพสูง คล้ายกับ Core Graphics
Canvas { ctx, size in
ctx.fill(
Path(ellipseIn: CGRect(origin: .zero, size: size)),
with: .color(.blue)
)
}การวาดรูปร่างใน Canvas
ใช้เมธอดของ GraphicsContext เช่น fill, stroke และ draw เพื่อแสดงเส้นทางและรูปภาพ
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)
}การใช้ TimelineView และ Canvas ร่วมกัน
วาง Canvas ไว้ภายใน TimelineView เพื่อสร้างแอนิเมชันทีละเฟรมโดยไม่ต้องอัปเดตสถานะของ 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))
}
}การแก้ไขสัญลักษณ์
เรียกใช้ ctx.resolve() เพื่อแปลงวิวของ SwiftUI (เช่น Image) เป็นสัญลักษณ์ที่วาดได้สำหรับ 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")
}ข้อความและสตริงที่มีแอตทริบิวต์ใน Canvas
วาดข้อความโดยใช้ ctx.draw(Text(...), at:) เพื่อแสดงป้ายกำกับแบบกำหนดเองภายใน Canvas
Canvas { ctx, size in
ctx.draw(
Text("Score: 100").font(.title).foregroundStyle(.white),
at: CGPoint(x: size.width/2, y: 30)
)
}การแปลงและการตัดพื้นที่
ใช้การแปลงแบบแอฟฟีนและเส้นทางตัดพื้นที่กับบริบทกราฟิกเพื่อสร้างเอฟเฟกต์ที่ซับซ้อน
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))
}ประสิทธิภาพเมื่อเทียบกับวิวของ SwiftUI
Canvas แสดงผลกราฟิกทั้งหมดในการวาดเพียงครั้งเดียว เหมาะสำหรับระบบอนุภาคหรือแผนภูมิที่ซับซ้อน ซึ่งการใช้วิวหลายพันรายการจะช้าเกินไป
// Benchmark: 500 moving dots
// Canvas: ~120fps on iPhone
// SwiftUI views: ~30fps due to view tree overheadความสามารถในการเข้าถึงใน Canvas
เนื้อหาใน Canvas จะมองไม่เห็นสำหรับ VoiceOver ให้เพิ่มป้ายกำกับด้านการช่วยการเข้าถึงผ่านตัวปรับแต่ง accessibilityChildren
Canvas { ctx, size in
// draw chart bars
}
.accessibilityChildren {
ForEach(bars) { Text("\($0.label): \($0.value)") }
}จังหวะการอัปเดตของ TimelineView
บริบทจะให้คำใบ้ cadence (แบบสด เป็นวินาที หรือเป็นนาที) เพื่อให้คุณลดรายละเอียดลงได้เมื่อระบบกำลังรับภาระหนัก
TimelineView(.animation) { ctx in
if ctx.cadence == .live {
HighDetailAnimation(date: ctx.date)
} else {
LowDetailAnimation(date: ctx.date)
}
}ตรวจสอบความเข้าใจ
TimelineSchedule ใดทำให้ TimelineView วาดใหม่ในทุกเฟรมของแอนิเมชัน
สรุปบทเรียน
TimelineView จะวาดใหม่ตามกำหนดการ (ทุกเฟรมเมื่อใช้ .animation) ส่วน Canvas มอบบริบทการวาดภาพ 2 มิติแบบโหมดทันที ใช้ทั้งสองอย่างร่วมกันเพื่อสร้างเอฟเฟกต์อนุภาค เกม และแผนภูมิแบบสดที่มีประสิทธิภาพสูง โดยไม่ต้องมีค่าใช้จ่ายจากการเปรียบเทียบวิวของ SwiftUI ในทุกเฟรม
คำถามที่พบบ่อย
บทเรียน “TimelineView และ Canvas สำหรับการวาดประสิทธิภาพสูง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “TimelineView และ Canvas สำหรับการวาดประสิทธิภาพสูง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “TimelineView และ Canvas สำหรับการวาดประสิทธิภาพสูง”
แสดงผลแอนิเมชันแบบเรียลไทม์ด้วยตารางเวลาของ TimelineView และ API ของ Canvas คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “TimelineView และ Canvas สำหรับการวาดประสิทธิภาพสูง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แอนิเมชันโดยนัยและโดยชัดแจ้ง
- matchedGeometryEffect สำหรับการเปลี่ยนฉากแบบฮีโร่
- AnimatableModifier และ Animatable แบบกำหนดเอง
- TimelineView และ Canvas สำหรับการวาดประสิทธิภาพสูง