我试图实现一个用户使用的照片剪裁工具,我坚持。我有一个UIView
(imageCropper
),其在顶部的UIImageView
(imageToBeEdited
)的(z顺序逐),其包含正被裁剪的图像。如果我现在运行应用程序,使用我的其他配置和逻辑,imageCropper
就在图像的顶部。但是,当我设置的imageToBeEdited
的maskView
到imageCropper
的imageCropper
转移的原点。在弄清了约束常量之后,我确定它正在由前导约束的确切值转变为更大的x,并且通过顶端约束的确切值确定更大的y。的UIView作为maskView-起源的约束转移常数
另一块信息,使这个更加混乱,是我有另一个UIView
(imageCropperBorder
)之上(再次z次序明智)的imageCropper
,仅仅充当一个可见的边框。我将它的框架设置为与imageCropper
完全相同的框架,但它们都是应该在的位置。
我没有制约imageCropper
或imageCropperBorder
设置。
我的问题是为什么imageCropper
正在移位,我该如何解决这个问题?
尝试几种不同的方法来创建启用用户,平滑移动裁剪工具后,我来到了由viewDidLoad
编程抓住制约的值,然后调整的起源回到这个解决方案,简单地创建x和y偏移imageCropper
在viewDidLayoutSubviews
和那工作。
不过,我有建立在ViewController
的视图panGestureRecognizer
。一旦我开始拖动照片(imageCropper
)进行裁剪,imageCropper
原点再次下移。我尝试将偏移逻辑添加到处理识别器的函数中,但它似乎将复合变化并将帧从屏幕上发送出去。 (我重置每个收到识别器的翻译。)
代码:
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
}
与往常一样,任何帮助,将不胜感激。
我会添加设置一个视图作为一个maskView使其成为该视图的子视图。 (我终于检查了这个调用.superview。)另外,因为我正在处理一个调整大小的图像,我不得不做一些计算,并且不能像原样那样使用超级视图的边界。谢谢您的帮助。 – Amelia