Swift Academy · บทเรียน

matchedGeometryEffect สำหรับการเปลี่ยนฉากแบบฮีโร่

สร้างแอนิเมชันฮีโร่ระหว่าง View ได้อย่างต่อเนื่องด้วยเนมสเปซและ ID ที่จับคู่กัน

บทเรียน 2 จาก 413 ขั้นตอน

matchedGeometryEffect สำหรับการเปลี่ยนฉากแบบฮีโร่ เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

matchedGeometryEffect คืออะไร

matchedGeometryEffect ทำให้ตำแหน่งและขนาดของวิวเคลื่อนไหวระหว่างสองสถานะ และสร้างการเปลี่ยนผ่านแบบ "ฮีโร่" ได้

struct HeroDemo: View {
  @Namespace private var ns
  @State private var expanded = false
  var body: some View {
    if expanded {
      BigCard().matchedGeometryEffect(id: "card", in: ns)
    } else {
      SmallCard().matchedGeometryEffect(id: "card", in: ns)
    }
  }
}

การสร้าง Namespace

ประกาศ @Namespace ในวิว parent วิวทั้งหมดที่จับคู่กันจะใช้เนมสเปซนี้ร่วมกัน

struct ParentView: View {
  @Namespace private var heroNamespace
}

การใช้ตัวปรับแต่ง

ใช้ .matchedGeometryEffect(id:in:) โดยกำหนด id เดียวกันให้กับทั้งวิวต้นทางและวิวปลายทาง

Image("cover")
  .matchedGeometryEffect(id: "albumArt", in: heroNamespace)

การเรียกใช้การเปลี่ยนผ่าน

ครอบการเปลี่ยนสถานะด้วย withAnimation เพื่อทำให้เรขาคณิตระหว่างวิวทั้งสองเคลื่อนไหว

Button("Expand") {
  withAnimation(.spring()) {
    isExpanded.toggle()
  }
}

ฮีโร่จากรายการไปยังรายละเอียด

รูปแบบฮีโร่แบบคลาสสิก: แตะรายการในรายการ แล้วรายการนั้นจะขยายเป็นรายละเอียดเต็มหน้าจอโดยใช้ matchedGeometryEffect

ForEach(items) { item in
  ThumbnailRow(item: item)
    .matchedGeometryEffect(id: item.id, in: ns)
    .onTapGesture { withAnimation { selected = item } }
}
if let sel = selected {
  DetailView(item: sel)
    .matchedGeometryEffect(id: sel.id, in: ns)
}

พารามิเตอร์ isSource

เมื่อวิวสองรายการใช้ id เดียวกัน ให้ระบุต้นทางด้วย isSource: true (ค่าเริ่มต้น) และระบุปลายทางด้วย isSource: false

SmallImage()
  .matchedGeometryEffect(id: "img", in: ns, isSource: true)
LargeImage()
  .matchedGeometryEffect(id: "img", in: ns, isSource: false)

คุณสมบัติจุดยึดและขนาด

ปรับแต่งได้ว่าจะจับคู่จุดยึดใดและคุณสมบัติเรขาคณิตใด (ตำแหน่ง/ขนาด)

.matchedGeometryEffect(
  id: "box",
  in: ns,
  anchor: .center,
  properties: [.position, .size]
)

การใช้ร่วมกับ AnyTransition

ใช้แอนิเมชันแบบฮีโร่ร่วมกับ .transition เพื่อควบคุมเพิ่มเติมว่าเนื้อหาจะค่อย ๆ ปรากฏหรือเลื่อนเข้ามาอย่างไร

DetailView()
  .matchedGeometryEffect(id: "card", in: ns)
  .transition(.opacity)

ฮีโร่หลายรายการในรายการ

ใช้ ID ที่ไม่ซ้ำกันซึ่งสร้างจากตัวระบุรายการ เพื่อเรียกใช้แอนิเมชันแบบฮีโร่ที่เป็นอิสระต่อกันหลายรายการ

ForEach(products) { p in
  ProductCard(p)
    .matchedGeometryEffect(id: p.id, in: ns)
}

ข้อผิดพลาดที่พบบ่อย

วิวทั้งสองรายการที่มี ID เดียวกันต้องไม่ปรากฏพร้อมกัน — ควรแสดงเพียงหนึ่งรายการในแต่ละครั้ง มิฉะนั้นจะเห็นปัญหาการจัดวาง

// Wrong: both views visible at same time
Small().matchedGeometryEffect(id: "x", in: ns)
Large().matchedGeometryEffect(id: "x", in: ns)
// Correct: use if/else or ZStack with opacity toggling

เคล็ดลับด้านประสิทธิภาพ

ทำให้วิวที่จับคู่กันมีโครงสร้างเรียบง่าย ลำดับชั้นที่ซับซ้อนภายในวิวที่จับคู่กันอาจทำให้เฟรมตกขณะทำแอนิเมชัน

// Prefer simple shapes inside matched containers
// Move heavy content outside the matched frame

ตรวจสอบความเข้าใจ

สิ่งใดจำเป็นในการเชื่อมวิวสองรายการให้เป็นต้นทางและปลายทางในการเปลี่ยนผ่านแบบฮีโร่

สรุปบทเรียน

สร้างการเปลี่ยนผ่านแบบฮีโร่ด้วย @Namespace และ .matchedGeometryEffect(id:in:) ครอบการเปลี่ยนสถานะด้วย withAnimation ตรวจสอบให้แน่ใจว่ามีวิวที่จับคู่กันแสดงอยู่เพียงหนึ่งรายการในแต่ละครั้ง เพื่อหลีกเลี่ยงความขัดแย้งในการจัดวาง

เริ่มต้นได้ฟรี

เรียนรู้ Swift ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
122
บทเรียน
409

คำถามที่พบบ่อย

บทเรียน “matchedGeometryEffect สำหรับการเปลี่ยนฉากแบบฮีโร่” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “matchedGeometryEffect สำหรับการเปลี่ยนฉากแบบฮีโร่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “matchedGeometryEffect สำหรับการเปลี่ยนฉากแบบฮีโร่”

สร้างแอนิเมชันฮีโร่ระหว่าง View ได้อย่างต่อเนื่องด้วยเนมสเปซและ ID ที่จับคู่กัน คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “matchedGeometryEffect สำหรับการเปลี่ยนฉากแบบฮีโร่” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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