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

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

iOS ไม่มี API อย่างเป็นทางการสำหรับถ่ายภาพหน้าจอทางโปรแกรม แต่มีวิธีใช้ปุ่ม Home + Power พร้อมกัน อย่างไรก็ตาม สามารถทำได้ผ่านการ Render Layer ของ Key Window

ขั้นตอนการทำ

  1. ดึง Layer ของ Key Window: UIApplication.shared.keyWindow?.layer
  2. ดึง Scale ของหน้าจอ: UIScreen.main.scale
  3. สร้าง Image Context ขนาดเท่า View
  4. Render Layer ลง Context และดึง UIImage
  5. บันทึกลง Photo Library

โค้ดตัวอย่าง

@IBAction func takeScreenshot(_ sender: Any) {
    guard let window = UIApplication.shared.keyWindow else { return }
    
    let scale = UIScreen.main.scale
    UIGraphicsBeginImageContextWithOptions(window.bounds.size, false, scale)
    
    guard let context = UIGraphicsGetCurrentContext() else { return }
    window.layer.render(in: context)
    
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    guard let screenshot = image else { return }
    UIImageWriteToSavedPhotosAlbum(screenshot, nil, nil, nil)
}

การตั้งค่า Info.plist

ต้องเพิ่ม Key: NSPhotoLibraryAddUsageDescription พร้อมคำอธิบายว่าทำไมต้องเข้าถึงรูปภาพ

ขยายเป็น Function/Extension

extension UIViewController {
    func captureScreen() -> UIImage? {
        guard let window = UIApplication.shared.keyWindow else { return nil }
        let scale = UIScreen.main.scale
        UIGraphicsBeginImageContextWithOptions(window.bounds.size, false, scale)
        window.layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

หมายเหตุ

  • ต้องขออนุญาตเข้าถึง Photos ครั้งแรก
  • ภาพจะบันทึกเป็น .jpg
  • ไม่ทำงานบน Simulator เนื่องจากไม่มี Key Window จริง
  • iOS 13+ ควรใช้ UIApplication.shared.windows.first { $0.isKeyWindow } แทน keyWindow (deprecated)