2016-05-30 19 views
1

Ich versuche, ein Benutzer-verwendetes Foto-Crop-Tool zu implementieren und bin fest. Ich habe eine UIView (imageCropper), die oben (z-Reihenfolge-weise) der UIImageView (imageToBeEdited) ist, die das Bild enthält, das beschnitten wird. Wenn ich die App zu diesem Zeitpunkt mit meinen anderen Konfigurationen und Logik starte, ist imageCropper direkt über dem Bild. Wenn ich jedoch maskView von imageToBeEdited auf imageCropper setze, verschiebt sich der Ursprung von imageCropper. Nachdem ich mit den Constraint-Konstanten herumgespielt habe, habe ich festgestellt, dass sie sich um den exakten Wert der führenden Constraint zu einem größeren x und um den exakten Wert der Top Constraint zu einem größeren y verschiebt.UIView als maskView- Ursprung verschoben durch Constraint-Konstanten

Ein weiteres Stück von Informationen, die dies noch verwirrender macht, ist, dass ich eine andere UIView habe (imageCropperBorder) auf der Oberseite (wieder z-Ordnung-weise) von imageCropper, die einfach als sichtbaren Grenze wirkt. Ich setze den Rahmen auf genau den gleichen Rahmen wie imageCropper und doch ist es dort, wo sie beide sein sollen.

Ich habe keine Einschränkungen auf imageCropper oder imageCropperBorder festgelegt.

Meine Fragen sind Warum ist imageCropper Verschiebung und wie behebe ich dieses Problem?

Nach mehreren verschiedenen Methoden versuchen, kam ich zu dieser Lösung wieder ein Benutzer-aktivierte, reibungslos zu bewegen Zuschneidetool zu schaffen und einfach erstellt x und y-Offsets durch programmgesteuert die Constraints' Werte in den viewDidLoad greifen und dann Einstellen den Ursprungs imageCropper in viewDidLayoutSubviews und das hat funktioniert.

Allerdings habe ich eine panGestureRecognizer eingerichtet auf der ViewController 's Ansicht. Sobald ich anfange, das Foto zu ziehen (imageCropper), um es zu beschneiden, verschiebt sich der Ursprung imageCropper wieder zurück. Ich habe versucht, die Offset-Logik in die Funktion, die den Erkenner behandelt, hinzuzufügen, aber es scheint, die Änderung zu komplementieren und den Rahmen vom Bildschirm zu senden. (Ich bin Zurücksetzen der Übersetzung mit jedem Empfang eines Erkennungs.)

Code:

override func viewDidLayoutSubviews() { 
    resizedImageFrame = AVMakeRectWithAspectRatioInsideRect(imageToEdit.image!.size, imageToEdit.bounds) 
    let resizedImageCenter = imageToEdit.center 
    let resizedImageX = resizedImageCenter.x - (resizedImageFrame.width/2) 
    let resizedImageY = resizedImageCenter.y - (resizedImageFrame.height/2) 
    resizedImageFrame.origin = CGPoint(x: resizedImageX, y: resizedImageY) 
    currentImageFrame = resizedImageFrame 
    imageCropperBorder.frame = resizedImageFrame 
    imageCropper.frame = CGRectOffset(resizedImageFrame, -cropperXOffset, -cropperYOffset) 
    // imageCropper.frame above is set with the offset discussed. If I set it 
    // to simply resizedImageFrame it does NOT appear where imageCropperBorder is 
} 

Wie immer jede Hilfe wäre sehr geschätzt.

Antwort

2

Wenn Sie imageCropper als imageView 's maskView festlegen. Es wird das imageView Koordinatensystem verwenden, um die imageCropper zu positionieren, also für imageCropper, ist Punkt (0,0) nicht an der oberen linken Ecke der ViewController Ansicht, sondern imageView ist oben links Ecke.

+1

Ich würde hinzufügen, dass das Festlegen einer Ansicht als maskView eine Unteransicht dieser Ansicht macht. (Ich überprüfte schließlich diesen Aufruf .superview.) Da ich mit einem skalierten Bild zu tun hatte, musste ich einige Berechnungen durchführen und konnte die Grenzen der Superview nicht so verwenden, wie es ist. Danke für die Hilfe. – Amelia