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.
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