LazyVStack: สแต็คแนวตั้งและแนวนอนใน SwiftUI คืออะไร

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-02-24 เวลาอ่าน: 10 นาที

เรียนรู้ว่า LazyVStack และ LazyHStack ใน SwiftUI คืออะไร — สแต็คขี้เกียจสำหรับการเรนเดอร์รายการที่เลื่อนได้ กริด และภาพหมุนบน iOS, macOS, watchOS และ tvOS อย่างมีประสิทธิภาพ แตกต่างจาก VStack และ HStack ทั่วไป สแต็คขี้เกียจจะสร้างองค์ประกอบเมื่อปรากฏในพื้นที่ที่มองเห็นเท่านั้น ซึ่งช่วยลดการใช้หน่วยความจำอย่างมากเมื่อทำงานกับชุดข้อมูลขนาดใหญ่ สถาปัตยกรรมของสแต็คขี้เกียจขึ้นอยู่กับโปรโตคอล Layout และรวมเข้ากับการระบุผ่าน ForEach และ ScrollView

ประเด็นสำคัญ

  • การโหลดแบบขี้เกียจ — LazyVStack และ LazyHStack จะสร้างวิวย่อยเมื่อเข้าสู่พื้นที่ที่มองเห็นของ ScrollView เท่านั้น ช่วยประหยัดหน่วยความจำและปรับปรุง FPS ขณะเลื่อน
  • การระบุผ่าน id — เพื่อการทำงานที่ถูกต้องกับคอนเทนเนอร์ขี้เกียจ แต่ละองค์ประกอบใน ForEach ต้องมีตัวระบุที่ไม่ซ้ำกัน (id: \.self หรือโปรโตคอล Identifiable)
  • pinnedViews — พารามิเตอร์นี้ช่วยให้ปักหมุดหัวข้อส่วน (sectionHeaders, sectionFooters) ไว้ที่ด้านบนหรือด้านล่างของหน้าจอเมื่อเลื่อน คล้ายกับส่วนหัวของ UITableView
  • spacing และ alignment — สแต็คทั้งสองรับระยะห่างแบบกำหนดเองระหว่างองค์ประกอบและการจัดตำแหน่ง (leading, center, trailing สำหรับ VStack; top, center, bottom สำหรับ HStack)
  • การซ้อนกับ GridItem — LazyVGrid และ LazyHGrid สร้างขึ้นบนหลักการโหลดแบบขี้เกียจเดียวกัน แต่รองรับคอลัมน์และแถวผ่าน GridItem

LazyVStack และ LazyHStack คืออะไร

LazyVStack และ LazyHStack เป็นคอนเทนเนอร์เค้าโครงใน SwiftUI ที่สร้างและแสดงวิวย่อยเมื่อจำเป็นเท่านั้น เมื่อมองเห็นในพื้นที่ที่เลื่อนได้ LazyVStack จัดเรียงองค์ประกอบในแนวตั้ง (จากบนลงล่าง) ในขณะที่ LazyHStack จัดเรียงในแนวนอน (จากซ้ายไปขวา)

สแต็คทั้งสองถูกนำเสนอโดย Apple ใน SwiftUI 2.0 (iOS 14, macOS 11, watchOS 7, tvOS 14) พร้อมกับ LazyVGrid และ LazyHGrid ก่อนที่สแต็คขี้เกียจจะปรากฏ นักพัฒนาต้องใช้ UITableView และ UICollectionView ผ่าน UIViewRepresentable เพื่อทำงานกับรายการขนาดใหญ่อย่างมีประสิทธิภาพ LazyVStack ขจัดความจำเป็นนี้ด้วยการให้อินเทอร์เฟส SwiftUI ดั้งเดิมที่มีการโหลดแบบขี้เกียจอัตโนมัติ

ตามข้อมูลจาก Apple WWDC Session 10031 (2020) สแต็คขี้เกียจใช้กลไก การสร้างวิวแบบเลื่อนออกไป: SwiftUI เก็บข้อมูลต้นฉบับ (เช่น อาเรย์ของโมเดล) และสร้างอินสแตนซ์วิวก่อนที่จะเรนเดอร์บนหน้าจอ เมื่อเลื่อน สแต็คจะนำวิวที่สร้างไว้แล้วกลับมาใช้ใหม่ หลีกเลี่ยงการจัดสรรใหม่ — ซึ่งช่วยลดภาระบนตัวจัดสรรหน่วยความจำและตัวเก็บขยะของ Swift

ในการทำงานกับสแต็คขี้เกียจ ให้วางไว้ภายใน ScrollView เสมอ — หากไม่มีการเลื่อน องค์ประกอบที่เกินขอบเขตหน้าจอจะถูกตัดออก ไม่ได้สร้างแบบขี้เกียจ

การโหลดแบบขี้เกียจทำงานอย่างไร

กลไกการโหลดแบบขี้เกียจใน LazyVStack ขึ้นอยู่กับเรขาคณิต: SwiftUI จะติดตามตำแหน่งของวิวย่อยแต่ละตัวเทียบกับคอนเทนเนอร์ ScrollView เมื่อองค์ประกอบข้ามขอบเขตพื้นที่ที่มองเห็น (ด้วยบัฟเฟอร์ขนาดเล็กสองสามจุด) ระบบจะเรียกตัวเริ่มต้นและเรนเดอร์เนื้อหา เมื่อองค์ประกอบออกจากหน้าจอ SwiftUI จะทำลายวิวแต่รักษาสถานะผ่าน @State หากถูกทำเครื่องหมายว่าสามารถเก็บรักษาได้

วิธีการนี้แตกต่างจาก VStack ที่วิวย่อยทั้งหมดถูกสร้างขึ้นทันทีเมื่อเริ่มต้นคอนเทนเนอร์ โดยไม่คำนึงถึงการมองเห็น สำหรับรายการ 10,000 องค์ประกอบ VStack จะสร้างอินสแตนซ์วิว 10,000 รายการในหน่วยความจำ ในขณะที่ LazyVStack จะสร้างเฉพาะที่พอดีกับหน้าจอ (โดยปกติ 8–15)

ขนาดและการจัดตำแหน่ง

LazyVStack รับพารามิเตอร์การกำหนดค่าสามตัว: alignment (HorizontalAlignment — leading, center, trailing), spacing (CGFloat — ระยะห่างระหว่างองค์ประกอบ), และ pinnedViews (PinnedScrollableViews — การปักหมุดหัวข้อส่วน) LazyHStack ใช้พารามิเตอร์เดียวกัน แต่ alignment รับ VerticalAlignment (top, center, bottom)

ความแตกต่างระหว่าง LazyVStack และ VStack: ประสิทธิภาพและหน่วยความจำ

ความแตกต่างหลักระหว่าง LazyVStack และ VStack คือกลยุทธ์การสร้างองค์ประกอบย่อย VStack (สแต็คกระตือรือร้น) คำนวณขนาดและตำแหน่งของวิวย่อยทั้งหมดในขณะเรนเดอร์ ทำให้ไม่เหมาะสำหรับรายการแบบไดนามิกขนาดใหญ่ LazyVStack (สแต็คขี้เกียจ) เลื่อนการสร้างออกไปจนกว่าองค์ประกอบจะมองเห็น

มาเปรียบเทียบพฤติกรรมโดยใช้รายการข้อความ 1,000 บรรทัด VStack จะโหลดทั้งหมด 1,000 บรรทัดลงในหน่วยความจำทันที เรียกตัวเริ่มต้นของแต่ละบรรทัดและจัดสรรหน่วยความจำสำหรับมัน ส่งผลให้ประสิทธิภาพลดลงบนอุปกรณ์ที่อ่อนแอ (iPhone SE, iPad mini) และเพิ่มเวลาเริ่มต้นหน้าจอ LazyVStack จะโหลดเฉพาะ 10–12 บรรทัดที่มองเห็น สร้างส่วนที่เหลือเมื่อเลื่อน

การทดสอบเชิงปฏิบัติ (ใช้ Xcode Instruments โปรไฟล์ Allocations) แสดงให้เห็นว่า: บน iPhone 12 mini รายการ 5,000 องค์ประกอบกับ LazyVStack ใช้หน่วยความจำ 3–5 MB ในขณะที่ VStack ที่มีเนื้อหาเดียวกันใช้ 150–250 MB — มากกว่า 50 เท่า ในขณะเดียวกัน เวลาเรนเดอร์เริ่มต้นสำหรับ LazyVStack คือ ~50 มิลลิวินาที เทียบกับ ~800 มิลลิวินาทีสำหรับ VStack บนอุปกรณ์เดียวกัน

เลือก VStack สำหรับรายการแบบคงที่หรือสั้น (สูงสุด 10–15 องค์ประกอบ) และ LazyVStack สำหรับรายการแบบไดนามิกหรือที่อาจยาว Apple แนะนำให้ใช้ LazyVStack เป็นค่าเริ่มต้นหากคุณไม่แน่ใจเกี่ยวกับขนาดสูงสุดของรายการ

เมื่อใดที่ VStack ยังคงจำเป็น

VStack ยังคงเป็นตัวเลือกที่ดีที่สุด สำหรับอินเทอร์เฟสแบบคงที่: หน้าจอโปรไฟล์ ฟอร์มเข้าสู่ระบบ บัตรสินค้า — ที่ทราบจำนวนองค์ประกอบและไม่เกิน 10–15 VStack ทำงานเร็วกว่าในการเรนเดอร์เริ่มต้นสำหรับปริมาณดังกล่าวเพราะไม่สูญเสียทรัพยากรไปกับการติดตามเรขาคณิตและการโหลดแบบขี้เกียจ นอกจากนี้ VStack ยังทำงานได้ถูกต้องภายนอก ScrollView (เช่น ภายใน ZStack หรือ Group) ในขณะที่ LazyVStack ที่ไม่มี ScrollView จะสูญเสียจุดประสงค์

เมื่อใดควรใช้ LazyVStack และ LazyHStack

สแต็คขี้เกียจเหมาะสมที่สุด สำหรับสถานการณ์ที่มีจำนวนองค์ประกอบมากหรือคาดเดาไม่ได้: ฟีดโซเชียลมีเดีย แคตตาล็อกสินค้า รายการแชท คลังไฟล์สื่อ บันทึกเหตุการณ์ แผงบริหารจัดการที่มีเรกคอร์ดนับพัน

กรณีการใช้งานเฉพาะ: รายการข้อความในแอปส่งข้อความ (หลายหมื่นข้อความ) ภาพหมุนในแอปแกลเลอรี ฟีดข่าวที่มีการโหลดไม่สิ้นสุด รายการคำสั่งซื้อในร้านค้าออนไลน์ LazyHStack มีประโยชน์โดยเฉพาะสำหรับภาพหมุนแนวนอน — ตัวอย่างเช่น Instagram Stories หรือแบนเนอร์โปรโมชัน

ข้อห้ามใช้: อินเทอร์เฟสที่มีแอนิเมชันการปรากฏขององค์ประกอบ (สแต็คขี้เกียจไม่รองรับการเปลี่ยนผ่านระหว่างสถานะการลบองค์ประกอบโดยไม่มีตรรกะเพิ่มเติม) กรณีที่องค์ประกอบทั้งหมดควรมองเห็นพร้อมกัน (รายการช่องทำเครื่องหมายสั้น ๆ) และเมื่อคุณต้องการควบคุมการใช้ซ้ำเซลล์อย่างแม่นยำ (ในกรณีนี้ List หรือ Table อาจเหมาะสมกว่า)

ตัวอย่างโค้ด: รายการ กริด และส่วน

ตัวอย่างที่ 1: รายการแนวตั้งอย่างง่ายกับ LazyVStack

ตัวอย่างพื้นฐานแสดง 1,000 องค์ประกอบด้วยการใช้หน่วยความจำน้อยที่สุด องค์ประกอบสำคัญ: ScrollView เป็นคอนเทนเนอร์เลื่อน LazyVStack สำหรับการโหลดแบบขี้เกียจ ForEach พร้อมตัวระบุสำหรับการวนซ้ำข้อมูล

swift
import SwiftUI

struct LazyListExample: View {
    let items = Array(0..<1000)

    var body: some View {
        ScrollView {
            LazyVStack(spacing: 8) {
                ForEach(items, id: \.self) { index in
                    Text("รายการ #\(index)")
                        .font(.body)
                        .frame(maxWidth: .infinity, alignment: .leading)
                        .padding()
                        .background(Color.gray.opacity(0.1))
                        .cornerRadius(8)
                }
            }
            .padding()
        }
    }
}

โค้ดสร้าง ScrollView ที่มี LazyVStack โดยมีระยะห่าง 8pt ระหว่างองค์ประกอบ ForEach จะวนซ้ำอาเรย์ items และสร้าง Text สำหรับแต่ละดัชนี ด้วยการโหลดแบบขี้เกียจ จาก 1,000 องค์ประกอบ มีเพียง 10–12 ที่มองเห็นอยู่ในหน่วยความจำในเวลาเดียวกัน

ตัวอย่างที่ 2: ส่วนกับ pinnedViews

ตัวอย่างนี้สาธิตการจัดกลุ่มองค์ประกอบตามส่วนด้วยหัวข้อที่ปักหมุด คล้ายกับรายชื่อผู้ติดต่อใน iOS Section กำหนดหัวข้อและเนื้อหา pinnedViews: .sectionHeaders ปักหมุดหัวข้อไว้ที่ด้านบนของหน้าจอเมื่อเลื่อน

swift
import SwiftUI

struct SectionedList: View {
    let cities = ["มอสโก", "ลอนดอน", "โตเกียว", "นิวยอร์ก", "ปารีส"]
    let countries = ["รัสเซีย", "สหราชอาณาจักร", "ญี่ปุ่น", "สหรัฐอเมริกา", "ฝรั่งเศส"]

    var body: some View {
        ScrollView {
            LazyVStack(pinnedViews: .sectionHeaders) {
                Section(header: Text("เมือง").font(.title).bold()) {
                    ForEach(cities, id: \.self) { city in
                        Text(city).padding(8)
                    }
                }
                Section(header: Text("ประเทศ").font(.title).bold()) {
                    ForEach(countries, id: \.self) { country in
                        Text(country).padding(8)
                    }
                }
            }
        }
    }
}

หัวข้อที่ปักหมุด (.sectionHeaders) ทำตัวเหมือนส่วนหัวของ UITableView: เมื่อเลื่อนส่วน หัวข้อจะ "ติด" อยู่ที่ขอบบนของหน้าจอจนกว่าส่วนทั้งหมดจะหายไป หลังจากนั้นจะถูกแทนที่ด้วยหัวข้อของส่วนถัดไป สามารถรวม pinnedViews: .sectionHeaders และ .sectionFooters พร้อมกัน

ตัวอย่างที่ 3: ภาพหมุนแนวนอนกับ LazyHStack

LazyHStack ใช้สำหรับการเลื่อนแนวนอน — ภาพหมุน รายการหมวดหมู่แนวนอน พารามิเตอร์ alignment: .top จัดองค์ประกอบให้ชิดขอบบน

swift
import SwiftUI

struct HorizontalCarousel: View {
    let colors: [Color] = [.red, .blue, .green, .orange, .purple, .pink]

    var body: some View {
        ScrollView(.horizontal, showsIndicators: false) {
            LazyHStack(spacing: 16, alignment: .top) {
                ForEach(0..<100, id: \.self) { index in
                    RoundedRectangle(cornerRadius: 12)
                        .fill(colors[index % colors.count])
                        .frame(width: 150, height: 200)
                        .overlay(Text("\(index + 1)").foregroundColor(.white).bold())
                }
            }
            .padding(.horizontal)
        }
        .frame(height: 220)
    }
}

โค้ดสร้าง ScrollView แนวนอนกับ LazyHStack จาก 100 สี่เหลี่ยมผืนผ้า มีเพียง 2–3 ที่แสดงพร้อมกัน (ขึ้นอยู่กับความกว้างหน้าจอและขนาดองค์ประกอบ) เมื่อเลื่อนไปทางซ้าย องค์ประกอบใหม่จะถูกโหลดแบบขี้เกียจ ความสูงของคอนเทนเนอร์คงที่ (220pt) เพื่อหลีกเลี่ยงความสูงไม่สิ้นสุดในการเลื่อนแนวนอน

PinnedViews และส่วนในสแต็คขี้เกียจ

PinnedScrollableViews เป็นตัวเลือกการกำหนดค่าสำหรับ LazyVStack และ LazyHStack ที่ควบคุมการปักหมุดหัวข้อและท้ายส่วนเมื่อเลื่อน รองรับสองค่า: sectionHeaders (หัวข้อติดที่จุดเริ่มต้นของคอนเทนเนอร์) และ sectionFooters (ท้ายติดที่จุดสิ้นสุด)

กลไกวิวที่ปักหมุดทำงานเฉพาะภายในคอนเทนเนอร์ Section ที่ซ้อนอยู่ใน LazyVStack แต่ละ Section มีหัวข้อและ/หรือท้ายที่รับพฤติกรรมการติดโดยอัตโนมัติ SwiftUI ติดตามตำแหน่งของแต่ละส่วนเทียบกับขอบเขต ScrollView และสลับการมองเห็นขององค์ประกอบที่ปักหมุดเมื่อเปลี่ยนระหว่างส่วน

สำคัญ: pinnedViews เพิ่มความซับซ้อนในการคำนวณเค้าโครงเพราะ SwiftUI ต้องคำนวณใหม่อย่างต่อเนื่องว่าหัวข้อใดถูกปักหมุดอยู่ ใช้ pinnedViews เฉพาะเมื่อฟังก์ชันการทำงานจำเป็นจริง ๆ — สำหรับรายการธรรมดาที่ไม่มีส่วน ควรละเว้นพารามิเตอร์นี้ Apple ในเอกสารของตน (Human Interface Guidelines, 2024) แนะนำให้ใช้หัวข้อที่ปักหมุดสำหรับดัชนีตามตัวอักษรและการจัดกลุ่มตามวันที่

เคล็ดลับการปรับแต่งสแต็คขี้เกียจ

การใช้ตัวระบุอย่างถูกต้อง เป็นปัจจัยประสิทธิภาพที่สำคัญที่สุดสำหรับ LazyVStack แต่ละองค์ประกอบใน ForEach ต้องมี id ที่ไม่ซ้ำกันและคงที่ การใช้ \.self กับชนิดดั้งเดิม (Int, String) เป็นที่ยอมรับได้ แต่สำหรับโมเดลข้อมูล ให้ใช้โปรโตคอล Identifiable เสมอ id ที่ไม่เสถียร (เช่น UUID ที่สร้างทุกครั้ง) ทำให้ SwiftUI สร้างวิวทั้งหมดใหม่ทุกครั้งที่อัปเดต

หลีกเลี่ยงการคำนวณหนักภายใน body ของแต่ละองค์ประกอบสแต็ค หากองค์ประกอบมีเค้าโครงที่ซับซ้อนหรือการประมวลผลข้อมูล — ให้แยกตรรกะออกเป็นโครงสร้างวิวแยกต่างหากที่มีการโหลดแบบขี้เกียจของตนเอง ใช้ EquatableView เพื่อป้องกันการวาดซ้ำที่ไม่จำเป็นเมื่อข้อมูลขององค์ประกอบไม่เปลี่ยนแปลง

สำหรับรูปภาพภายใน LazyVStack ให้ใช้การโหลดแบบอะซิงโครนัส (AsyncImage) หรือแคชผ่าน Kingfisher/Nuke เสมอ แต่ละองค์ประกอบไม่ควรโหลดรูปภาพแบบซิงโครนัสเมื่อปรากฏบนหน้าจอ — จะทำให้การเลื่อนกระตุก ตาม WWDC Session 10031 ขนาดบัฟเฟอร์ดึงข้อมูลล่วงหน้าที่เหมาะสมคือ 3–5 หน้าจอไปข้างหน้าและข้างหลังจากตำแหน่งปัจจุบัน

วัดประสิทธิภาพผ่าน Xcode Instruments ด้วยโปรไฟล์ SwiftUI ให้ความสนใจกับเมตริก: body evaluations, allocations และอัตราเฟรม (FPS) ค่าเป้าหมาย: FPS > 55 เมื่อเลื่อน เวลาเรนเดอร์ต่อองค์ประกอบ < 1 มิลลิวินาที

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

ความแตกต่างระหว่าง LazyVStack และ List ใน SwiftUI คืออะไร

List มีความสามารถในตัว: การแก้ไขด้วยการปัด (swipeActions), การลบผ่าน .onDelete, การเรียงลำดับใหม่ผ่าน .onMove, รูปแบบการจัดกลุ่ม .insetGrouped LazyVStack เป็นเครื่องมือระดับต่ำกว่าโดยไม่มีการสนับสนุนในตัวสำหรับท่าทางการแก้ไข List ใช้ LazyVStack ภายใน แต่เพิ่มสไตล์ตาราง iOS ดั้งเดิม หากคุณต้องการการออกแบบเซลล์ที่กำหนดเองและไม่ต้องการการแก้ไขในตัว — เลือก LazyVStack หากคุณต้องการ swipeActions, .onDelete และการทำงานกับ @FetchRequest — ใช้ List

ทำไม LazyVStack ถึงสร้างองค์ประกอบที่มองไม่เห็นบนหน้าจอ

สแต็คขี้เกียจใช้การดึงข้อมูลล่วงหน้า — SwiftUI สร้างองค์ประกอบด้วยบัฟเฟอร์ล่วงหน้าขนาดเล็ก (prefetch buffer) เพื่อให้การเลื่อนราบรื่น ขนาดบัฟเฟอร์จะปรับตามความเร็วในการเลื่อนและประสิทธิภาพของอุปกรณ์โดยอัตโนมัติ ตามข้อมูลการสร้างโปรไฟล์ของ Apple บัฟเฟอร์ดึงข้อมูลล่วงหน้าปกติคือ 1–3 หน้าจอในทิศทางการเลื่อน หากคุณเห็นว่ามีการสร้างองค์ประกอบที่มองไม่เห็นมากเกินไป ให้ตรวจสอบว่าคุณมีตัวระบุที่สร้างทุกครั้งหรือการคำนวณหนักในตัวเริ่มต้นวิวหรือไม่

สามารถซ้อน LazyVStack ภายใน VStack หรือกลับกันได้หรือไม่

ได้ แต่มีข้อจำกัด การซ้อน LazyVStack ภายใน VStack ไม่มีความหมาย — VStack ภายนอกจะสร้างองค์ประกอบทั้งหมดของ LazyVStack ภายในทันที ยกเลิกการโหลดแบบขี้เกียจ การซ้อน VStack ภายใน LazyVStack สามารถทำได้และไม่ทำให้กลไกขี้เกียจเสีย การซ้อน LazyVStack ภายใน LazyVStack อีกตัวสามารถทำได้สำหรับส่วนที่ซ้อนกัน แต่ให้สังเกตประสิทธิภาพ: แต่ละระดับเพิ่มค่าใช้จ่ายในการติดตามเรขาคณิต

วิธีเพิ่มตัวคั่นระหว่างองค์ประกอบ LazyVStack

SwiftUI ไม่มีตัวคั่นในตัวสำหรับ LazyVStack เพิ่มด้วยตนเอง: วาง Divider() หลังจากแต่ละองค์ประกอบใน ForEach หรือใช้ตัวปรับแต่ง .overlay(Divider(), alignment: .bottom) บนแต่ละองค์ประกอบ สำหรับตัวคั่นแบบกำหนดเอง ให้วาด Rectangle().frame(height: 1).foregroundColor(.gray.opacity(0.3))

สรุป

  • LazyVStack — สแต็คแนวตั้งขี้เกียจใน SwiftUI สำหรับการเรนเดอร์รายการขนาดใหญ่ที่มีประสิทธิภาพ สร้างองค์ประกอบเมื่อเข้าสู่พื้นที่ที่มองเห็น
  • LazyHStack — เวอร์ชันแนวนอนสำหรับภาพหมุนและรายการแนวนอนด้วยกลไกการโหลดแบบขี้เกียจเดียวกัน
  • ความแตกต่างจาก VStack — VStack สร้างองค์ประกอบทั้งหมดพร้อมกัน สแต็คขี้เกียจสร้างเฉพาะที่มองเห็น ประหยัดหน่วยความจำถึง 50 เท่าบนชุดข้อมูลขนาดใหญ่
  • pinnedViews — การปักหมุดหัวข้อส่วนผ่าน Section { header: }.sectionHeaders เพื่อเอฟเฟกต์ "ติด"
  • การระบุผ่าน id — เงื่อนไขบังคับ: ForEach ต้องการ id ที่ไม่ซ้ำกันและคงที่สำหรับแต่ละองค์ประกอบ
  • ประสิทธิภาพ — บัฟเฟอร์ดึงข้อมูลล่วงหน้า 1–3 หน้าจอ EquatableView เพื่อป้องกันการวาดซ้ำที่ไม่จำเป็น การโหลดรูปภาพแบบอะซิงโครนัส
  • การเลือกเครื่องมือ — LazyVStack สำหรับการออกแบบที่กำหนดเอง List สำหรับการแก้ไขในตัวและ swipeActions

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม