【发布时间】:2017-01-15 20:04:55
【问题描述】:
我一直致力于制作一个视图控制器,它将图像裁剪为特定大小,并带有一些可拖动的控制点,并且裁剪区域之外的背景图像变暗。
由于某种原因,只要图像被裁剪,它就会抓取错误的参考。我已经看过几乎所有其他关于裁剪的帖子。
我问过其他几个人,包括我正在学习的课程的导师和导师,但我们似乎都被难住了。
我可以通过拖动视图控制器周围的 UL UR DL DR 角来选择一个框架,如下所示:
但是当我按下按钮并使用我编写的裁剪功能时,我得到的东西不是基于框架选择的正确裁剪。
在裁剪过程中我也收到此错误消息:
2016-09-07 23:36:38.962 ImageCropView[33133:1056024]
<UIView: 0x7f9cfa42c730; frame = (0 0; 414 736); autoresize = W+H; layer = <CALayer: 0x7f9cfa408400>>'s window
is not equal to <ImageCropView.CroppedImageViewController: 0x7f9cfa43f9b0>'s view's window!
代码中有问题的部分必须位于以下函数之一中。
这里是裁剪功能:
func cropImage(image: UIImage, toRect rect: CGRect) -> UIImage {
func rad(deg: CGFloat) -> CGFloat {
return deg / 180.0 * CGFloat(M_PI)
}
// determine the orientation of the image and apply a transformation to the crop rectangle to shift it to the correct position
var rectTransform: CGAffineTransform
switch image.imageOrientation {
case .Left:
rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(90)), 0, -image.size.height)
case .Right:
rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-90)), -image.size.width, 0)
case .Down:
rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-180)), -image.size.width, -image.size.height)
default:
rectTransform = CGAffineTransformIdentity
}
// adjust the transformation scale based on the image scale
rectTransform = CGAffineTransformScale(rectTransform, UIScreen.mainScreen().scale, UIScreen.mainScreen().scale)
// apply the transformation to the rect to create a new, shifted rect
let transformedCropSquare = CGRectApplyAffineTransform(rect, rectTransform)
// use the rect to crop the image
let imageRef = CGImageCreateWithImageInRect(image.CGImage, transformedCropSquare)
// create a new UIImage and set the scale and orientation appropriately
let result = UIImage(CGImage: imageRef!, scale: image.scale, orientation: image.imageOrientation)
return result
}
这里是设置和翻译遮罩视图的函数
func setTopMask(){
let path = CGPathCreateWithRect(cropViewMask.frame, nil)
topMaskLayer.path = path
topImageView.layer.mask = topMaskLayer
}
func translateMask(sender: UIPanGestureRecognizer) {
let translation = sender.translationInView(self.view)
sender.view!.center = CGPointMake(sender.view!.center.x + translation.x, sender.view!.center.y + translation.y)
// print(sender.translationInView(self.view))
sender.setTranslation(CGPointZero, inView: self.view)
// print("panned mask")
if sender.state == .Ended {
printFrames()
}
}
func setCropMaskFrame() {
let x = ulCorner.center.x
let y = ulCorner.center.y
let width = urCorner.center.x - ulCorner.center.x
let height = blCorner.center.y - ulCorner.center.y
cropViewMask.frame = CGRectMake(x, y, width, height)
setTopMask()
}
【问题讨论】:
-
您真的需要显示所有代码才能提出这个问题吗?我不知道在哪里看。 “它抓取了错误的引用”甚至意味着是什么意思?我不知道问题是什么。
-
嗨,马特,如果有点冗长,对不起。我只是想确保上下文清楚。我正在使用几个视图来操作其他视图,然后最终尝试根据由这些视图调整大小的掩蔽视图的边界来抓取图像视图的一部分。
-
我建议你制作一个 MCVE(最小的完整可验证示例)。告诉我如何解决您遇到的问题,别无其他。
-
马特,我已经更新了我的问题以缩小要查看的区域,并提供了一些正在发生的事情的屏幕截图。谢谢!
-
“代码中的违规部分必须位于以下函数之一中。”也许,但也许不是。让我们专注于错误消息。您是否在代码中的某个位置创建了一个新窗口?
标签: swift core-graphics crop