0Pricing
Swift Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แอนิเมชันโดยนัยและโดยชัดแจ้ง
  2. matchedGeometryEffect สำหรับการเปลี่ยนฉากแบบฮีโร่
  3. AnimatableModifier และ Animatable แบบกำหนดเอง
  4. TimelineView และ Canvas สำหรับการวาดประสิทธิภาพสูง
← กลับไปที่ Swift Academy