Tôi muốn người dùng truy cập ứng dụng của tôi và chụp ảnh màn hình ứng dụng sau khi nhấn một nút lập trình trong Swift. Tôi biết rằng UIGraphicsGetImageFromCurrentImageContext()
có ảnh chụp màn hình nhưng tôi không muốn ảnh của toàn bộ màn hình. Tôi muốn một hình chữ nhật để bật lên (loại giống như một công cụ cắt) và người dùng có thể kéo và thay đổi kích thước hình chữ nhật để có một ảnh chụp màn hình của chỉ một phần nhất định của màn hình. Tôi muốn hình chữ nhật đi qua một hình ảnh WKWebView
và cắt một pic của chế độ xem web.Cách chụp màn hình phần của UIView?
6
A
Trả lời
16
Kỹ thuật chụp nhanh tiêu chuẩn là drawViewHierarchyInRect
. Và để lấy một phần của hình ảnh, bạn có thể sử dụng CGImageCreateWithImageInRect
.
Như vậy, trong Swift 2:
extension UIView {
/// Create snapshot
///
/// - parameter rect: The `CGRect` of the portion of the view to return. If `nil` (or omitted),
/// return snapshot of the whole view.
///
/// - returns: Returns `UIImage` of the specified portion of the view.
func snapshot(of rect: CGRect? = nil) -> UIImage? {
// snapshot entire view
UIGraphicsBeginImageContextWithOptions(bounds.size, opaque, 0)
drawViewHierarchyInRect(bounds, afterScreenUpdates: true)
let wholeImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// if no `rect` provided, return image of whole view
guard let rect = rect, let image = wholeImage else { return wholeImage }
// otherwise, grab specified `rect` of image
let scale = image.scale
let scaledRect = CGRect(x: rect.origin.x * scale, y: rect.origin.y * scale, width: rect.size.width * scale, height: rect.size.height * scale)
guard let cgImage = CGImageCreateWithImageInRect(image.CGImage!, scaledRect) else { return nil }
return UIImage(CGImage: cgImage, scale: scale, orientation: .Up)
}
}
Trong Swift 3:
extension UIView {
/// Create snapshot
///
/// - parameter rect: The `CGRect` of the portion of the view to return. If `nil` (or omitted),
/// return snapshot of the whole view.
///
/// - returns: Returns `UIImage` of the specified portion of the view.
func snapshot(of rect: CGRect? = nil) -> UIImage? {
// snapshot entire view
UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0)
drawHierarchy(in: bounds, afterScreenUpdates: true)
let wholeImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// if no `rect` provided, return image of whole view
guard let image = wholeImage, let rect = rect else { return wholeImage }
// otherwise, grab specified `rect` of image
let scale = image.scale
let scaledRect = CGRect(x: rect.origin.x * scale, y: rect.origin.y * scale, width: rect.size.width * scale, height: rect.size.height * scale)
guard let cgImage = image.cgImage?.cropping(to: scaledRect) else { return nil }
return UIImage(cgImage: cgImage, scale: scale, orientation: .up)
}
}
Và để sử dụng nó, bạn có thể làm:
if let image = webView.snapshot(of: rect) {
// do something with `image` here
}
3
Đây là một câu hỏi hỏi trước tại How to capture UIView to UIImage without loss of quality on retina display nhưng để mở rộng trong nhanh chóng (2.3):
extension UIView {
class func image(view: UIView) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0)
guard let ctx = UIGraphicsGetCurrentContext() else {
return nil
}
view.layer.renderInContext(ctx)
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return img
}
func image() -> UIImage? {
return UIView.image(self)
}
}
Vì vậy, bạn có thể có được một hình ảnh từ một cái nhìn với UIView.image(theView)
hoặc bằng cách yêu cầu xem bản thân let viewImage = self.view.image()
Hãy ghi nhớ mặc dù điều này là thô và có thể cần tiếp tục xem xét cho an toàn chủ đề vv.
Các vấn đề liên quan
- 1. iOS 7 chụp ảnh màn hình một phần của UIView
- 2. Cách chụp một phần của màn hình
- 3. iOS Ảnh chụp màn hình một phần của màn hình
- 4. ios cách chụp một phần cụ thể của màn hình
- 5. cách chụp ảnh chụp màn hình?
- 6. Chụp màn hình màn hình hiện tại của thiết bị
- 7. Chụp màn hình
- 8. Chụp màn hình của màn hình Hiện tại
- 9. UIView toàn màn hình
- 10. Android - Không chụp màn hình của màn hình hiện tại
- 11. Cách thực hiện lựa chọn vùng ảnh chụp màn hình bằng cách vẽ trên màn hình để chụp màn hình?
- 12. Cách tạo ảnh chụp màn hình của QWidget?
- 13. html5 chụp màn hình
- 14. Chụp ảnh màn hình của Android OpenGL
- 15. Chụp màn hình của điều khiển WebBrowser
- 16. iOS Chụp nhiều ảnh chụp màn hình
- 17. cách chụp màn hình của video hiện đang phát?
- 18. C#: làm thế nào để có một ảnh chụp màn hình của một phần của màn hình
- 19. Chụp nhanh một ẩn UIView
- 20. Cách chụp ảnh màn hình một phần của Google Maps sử dụng JavaScript
- 21. Chụp UIView dưới dạng UIImage
- 22. Ảnh chụp màn hình Webdriver
- 23. Cách lấy ảnh chụp màn hình của màn hình nền từ bộ đệm sau bằng DirectX
- 24. Chụp màn hình trong android
- 25. Chụp màn hình trong Go?
- 26. Ảnh chụp màn hình WKWebView
- 27. Chụp ảnh màn hình của một UIView nơi các phụ đề của nó là các phiên máy ảnh
- 28. Đặt UIView ở giữa màn hình
- 29. Ảnh chụp màn hình của biểu mẫu có kích thước lớn hơn kích thước màn hình
- 30. Chụp UIView và Lưu dưới dạng Hình ảnh
lớn công việc như mọi khi Rob. Cảm ơn. – damirstuhec
Giải pháp hoàn hảo. Có những cái khác trên SO nhưng chúng chiếm toàn bộ màn hình. Đây là giải pháp cho cả hai. – Septronic