iOS ไม่มี API อย่างเป็นทางการสำหรับถ่ายภาพหน้าจอทางโปรแกรม แต่มีวิธีใช้ปุ่ม Home + Power พร้อมกัน อย่างไรก็ตาม สามารถทำได้ผ่านการ Render Layer ของ Key Window
ขั้นตอนการทำ
- ดึง Layer ของ Key Window:
UIApplication.shared.keyWindow?.layer - ดึง Scale ของหน้าจอ:
UIScreen.main.scale - สร้าง Image Context ขนาดเท่า View
- Render Layer ลง Context และดึง UIImage
- บันทึกลง 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)