2016-05-30 21 views
1

我试图实现一个用户使用的照片剪裁工具,我坚持。我有一个UIViewimageCropper),其在顶部的UIImageViewimageToBeEdited)的(z顺序逐),其包含正被裁剪的图像。如果我现在运行应用程序,使用我的其他配置和逻辑,imageCropper就在图像的顶部。但是,当我设置的imageToBeEditedmaskViewimageCropperimageCropper转移的原点。在弄清了约束常量之后,我确定它正在由前导约束的确切值转变为更大的x,并且通过顶端约束的确切值确定更大的y。的UIView作为maskView-起源的约束转移常数

另一块信息,使这个更加混乱,是我有另一个UIViewimageCropperBorder)之上(再次z次序明智)的imageCropper,仅仅充当一个可见的边框。我将它的框架设置为与imageCropper完全相同的框架,但它们都是应该在的位置。

我没有制约imageCropperimageCropperBorder设置。

我的问题是为什么imageCropper正在移位,我该如何解决这个问题?

尝试几种不同的方法来创建启用用户,平滑移动裁剪工具后,我来到了由viewDidLoad编程抓住制约的值,然后调整的起源回到这个解决方案,简单地创建x和y偏移imageCropperviewDidLayoutSubviews和那工作。

不过,我有建立在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 
} 

与往常一样,任何帮助,将不胜感激。

回答

2

当您设置imageCropperimageView的maskView。它将使用imageView的坐标系来定位imageCropper,因此对于imageCropper,点(0,0)不在ViewController的视图的左上角,而是在imageView的左上角。

+1

我会添加设置一个视图作为一个maskView使其成为该视图的子视图。 (我终于检查了这个调用.superview。)另外,因为我正在处理一个调整大小的图像,我不得不做一些计算,并且不能像原样那样使用超级视图的边界。谢谢您的帮助。 – Amelia