2017-08-17 1 views
0

Ich habe schon seit einiger Zeit damit zu kämpfen. Ich möchte den Bild-Ausschnitt ähnlich dem in iOS selbst aussehen lassen, wenn Sie Ihr Hintergrundbild auswählen. Grundsätzlich möchte ich den Bereich, den Benutzer aus dem Bild mit Zoom und Seitenverhältnis des Bildschirms beschnitten wählt (so kann der Benutzer das Bild als Hintergrund später verwenden). Wie folgt aus:Zuschneiden Teil von UIImage mit dem Bildschirm Seitenverhältnis

https://gfycat.com/TornMaleAlligatorsnappingturtle

Ich habe es geschafft, die Schnittstelle mit UIScrollView und UIImageView zu erstellen: kann

import UIKit 

class ViewController: UIViewController, UIScrollViewDelegate { 

var scrollView: UIScrollView! 
var imageView: UIImageView! 

var croppedImage: UIImage? 

@IBOutlet weak var cropButton: UIButton! { 
    didSet{ 
     cropButton.backgroundColor = UIColor.gray 
    } 
} 


override func viewDidLoad() { 

    super.viewDidLoad() 

    let image = UIImage(named: "mountains")! 

    imageView = UIImageView(image: image) 
    imageView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size:image.size) 
    imageView.contentMode = .scaleAspectFill 

    scrollView = UIScrollView(frame: view.bounds) 
    scrollView.backgroundColor = UIColor.black 
    scrollView.contentSize = imageView.bounds.size 

    scrollView.delegate = self 

    setZoomScale() 
    //centerScrollViewContents() 

    scrollView.addSubview(imageView) 
    view.addSubview(scrollView) 
    view.bringSubview(toFront: cropButton) 

} 

func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
    return imageView 
} 

@IBAction func crop(_ sender: UIButton) { 

    let rect = CGRect(x: ?, y: ?, width: ?, height: ?) 
    let croppedCGImage = imageView.image?.cgImage?.cropping(to: rect) 
    self.croppedImage = UIImage(cgImage: croppedCGImage!) 
} 

func setZoomScale() { 
    let imageViewSize = imageView.bounds.size 
    let scrollViewSize = scrollView.bounds.size 
    //let widthScale = scrollViewSize.width/imageViewSize.width 
    let heightScale = scrollViewSize.height/imageViewSize.height 

    scrollView.minimumZoomScale = heightScale //min(widthScale, heightScale) 
    scrollView.maximumZoomScale = 3 
    scrollView.zoomScale = heightScale 

    print(heightScale) 
} 
}. 

ich um das Bild kein Problem Zoom- und Pan. Das Problem ist, dass ich nicht weiß, wie das CGRect-Rechteck erstellt wird, das den Bereich darstellt, der dem Benutzer angezeigt wird. Dies ist auch der Bereich, den ich aus dem Originalbild zuschneiden möchte. Irgendwelche Ideen, die mich aus meinem Elend bringen werden, werden sehr geschätzt!

Antwort

3

snapshotImageFromMyView ist das Ausgangsbild

self.btn.isHidden = true 

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 
     UIGraphicsBeginImageContextWithOptions(self.YourView.bounds.size, self.YourView.isOpaque, 0.0) 
     self.YourView.drawHierarchy(in: self.YourView.bounds, afterScreenUpdates: false) 
    let snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

} 
+0

Das funktioniert gut, aber ich habe Tasten auf dem Bildschirm, die als gut Snapshot von ihr erstellt, auch wenn ich sie über isHidden Eigentum verstecken. – MHCsk

+0

verstecken Sie die Dinge, die Sie nicht Teil des Screenshots @MHCsk –

+0

sein möchte Ich rufe self.cropButton.isHidden = True direkt vor dem Code, aber die Schaltfläche ist immer noch auf dem Snapshot sichtbar. – MHCsk

Verwandte Themen