จับภาพหน้าจอ (Screenshot) ด้วยโค้ด Swift บน iOS
ใช้ UIGraphicsBeginImageContextWithOptions ระบุ View ที่ต้องการ Capture แล้ว Render Layer ลง Graphics Context
ขั้นตอนที่ 1: สร้างโปรเจกต์
Xcode → Single View App → ชื่อ "TakeScreenShot"
ขั้นตอนที่ 2: ออกแบบ UI
- UITextField (สำหรับทดสอบเนื้อหาเปลี่ยน)
- UIButton "Take Snapshot"
- UIImageView (แสดงผล Screenshot, ตั้ง Border สีแดง)
ขั้นตอนที่ 3: IBOutlet และ IBAction
@IBOutlet weak var snapShotImageView: UIImageView!
@IBAction func takeSnapShotClicked(_ sender: Any) {
// 1. เริ่ม Graphics Context
UIGraphicsBeginImageContextWithOptions(view.layer.frame.size, false, UIScreen.main.scale)
// 2. ดึง Context ปัจจุบัน
guard let context = UIGraphicsGetCurrentContext() else { return }
// 3. Render Layer ของ View ลง Context
view.layer.render(in: context)
// 4. ดึง UIImage จาก Context
let screenshot = UIGraphicsGetImageFromCurrentImageContext()
// 5. จบ Context
UIGraphicsEndImageContext()
// 6. แสดงผล
snapShotImageView.image = screenshot
}
ขั้นตอนที่ 4: ตั้งค่า Border ให้ ImageView (ใน viewDidLoad)
override func viewDidLoad() {
super.viewDidLoad()
snapShotImageView.layer.borderColor = UIColor.systemRed.cgColor
snapShotImageView.layer.borderWidth = 2.0
snapShotImageView.contentMode = .scaleAspectFit
}
ขั้นตอนที่ 5: รันทดสอบ
- พิมพ์ข้อความใน Text Field
- กด "Take Snapshot"
- UIImageView จะแสดง Screenshot ของหน้าจอทั้งหมด
ปรับปรุงสำหรับ Production
Capture เฉพาะ View מסוים (ไม่ใช่ทั้งหน้าจอ)
func captureView(_ view: UIView) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, UIScreen.main.scale)
view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
บันทึกลง Photo Library
import Photos
func saveToPhotos(_ image: UIImage) {
PHPhotoLibrary.requestAuthorization { status in
guard status == .authorized else { return }
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAsset(from: image)
})
}
}
iOS 10+ ใช้ UIGraphicsImageRenderer (Modern API)
let renderer = UIGraphicsImageRenderer(bounds: view.bounds)
let screenshot = renderer.image { ctx in
view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
}
// ใช้ screenshot ได้เลย - จัดการ Context เองอัตโนมัติ
กรณีใช้งานจริง
- Bug Report: ให้ผู้ใช้ส่ง Screenshot พร้อม Log
- Social Sharing: แชร์ High Score, Achievement
- Tutorial/Onboarding: บันทึกขั้นตอนการใช้งาน