Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> iOS

วิธีถ่ายภาพหน้าจอ (Screenshot) โดยโปรแกรมบน iOS

จับภาพหน้าจอ (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: รันทดสอบ

  1. พิมพ์ข้อความใน Text Field
  2. กด "Take Snapshot"
  3. 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: บันทึกขั้นตอนการใช้งาน