Ich möchte, dass der Benutzer auf meine App gehen und einen Screenshot der App nach dem programmgesteuerten Drücken einer Taste in Swift machen. Ich weiß, dass UIGraphicsGetImageFromCurrentImageContext()
einen Screenshot macht, aber ich möchte kein Bild des gesamten Bildschirms. Ich möchte, dass ein Rechteck angezeigt wird (ähnlich wie ein Zuschneidewerkzeug), und der Benutzer kann das Rechteck ziehen und seine Größe ändern, um einen Screenshot nur eines bestimmten Teils des Bildschirms aufzunehmen. Ich möchte das Rechteck über eine WKWebView
gehen und ein Bild der Webansicht zuschneiden.Wie man einen Screenshot des Teils von UIView macht?
6
A
Antwort
16
Die Standard-Snapshot-Technik ist drawViewHierarchyInRect
. Um einen Teil eines Bildes zu erhalten, können Sie CGImageCreateWithImageInRect
verwenden.
So in 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)
}
}
In 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)
}
}
Und, es zu benutzen, können Sie tun:
if let image = webView.snapshot(of: rect) {
// do something with `image` here
}
3
Dies ist eine zuvor gestellte Frage an How to capture UIView to UIImage without loss of quality on retina display aber in schnellen (2.3) zu erweitern: Sie
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)
}
}
So kann entweder ein Bild aus einer Ansicht mit UIView.image(theView)
oder indem er die Ansicht, selbst let viewImage = self.view.image()
Denken Sie jedoch daran, dass dies grob ist und wahrscheinlich weitere Untersuchungen zur Fadensicherheit usw. erforderlich sind.
Verwandte Themen
- 1. iOS 7 Screenshot eines Teils einer UIView
- 2. Wie man einen Screenshot von UIView macht und es benutzt, hat einen Hintergrund mit Unschärfen?
- 3. C#: Wie Sie einen Screenshot eines Teils des Bildschirms nehmen
- 4. Wie macht man einen Screenshot einer Webseite?
- 5. Wie man einen Screenshot des Layouts unter
- 6. Wie macht man ein Bild von einer UIView?
- 7. Wie man einen Screenshot einer Webseite mit Javascript macht
- 8. Wie erstellt man einen Screenshot des gesamten Inhalts eines Scrollview?
- 9. Wie man Screenshot unter Wayland macht?
- 10. Wie erstellt man einen Screenshot von QWidget?
- 11. Wie man Screenshot im Winkelmesser bei Versagen von Testfällen macht
- 12. Ist es möglich, im InternetExplorerDriver einen Screenshot des sichtbaren Teils der Seite zu erstellen?
- 13. Erkennen, wenn ein Benutzer einen Screenshot macht
- 14. Wie man Screenshot der GANZE Aktivitätsseite programmatisch macht?
- 15. Wie man einen SKNode zu UIImage macht
- 16. Screenshot von UIView mit UIScrollView innerhalb
- 17. Wie man den Screenshot der ganzen Seite im Winkelmesser macht?
- 18. Wie erstellt man einen Gradientenrahmen von UIView?
- 19. [iOS] Wie man einen "Schnappschuss" des aktuellen Ansichtszustands macht
- 20. Wie programmiere ich einen Screenshot des iPhones?
- 21. Wie man den Screenshot eines Teils von Google Maps erstellt JavaScript verwenden
- 22. Ohne iPhone, wie man Screenshot mit XCode macht?
- 23. Wie man den Screenshot der benutzerdefinierten Kamera in Android macht?
- 24. Wie versteckt man einen Subframe einer UIView?
- 25. Wie man einen TRUE Rescan des PCIe Busses macht
- 26. Einen Screenshot des Fensters im Hintergrund erstellen
- 27. Wie man einen div einen Link macht
- 28. Swift: Wie macht man eine UIView in UITableViewCell anklickbar?
- 29. Wie macht man einen transparenten Schnitt auf UIVisualEffectView?
- 30. Wie man Screenshot macht, während man das Video von der Kamera zeigt?
Große Arbeit wie immer Rob. Vielen Dank. – damirstuhec
Perfekte Lösung. Es gibt andere auf SO, aber sie erfassen den gesamten Bildschirm. Dies ist die Lösung für beide. – Septronic