类似Snapchat的文字在图像上

我一直在试图在图像上实现类似Snapchat的编辑文本。 我到目前为止所做的是在UIImageView的中心实现一个UILabel,并且向这个UILabel添加了3个手势:UIPanGestureRecognizer,UIPinchGestureRecognizer和UIRotationGestureRecognizer。

我已经设法实现了泛方法,但我很难让Pinch + Rotation像他们一样stream畅,我得到了可怕的结果T_T

你们觉得这是怎么产生的? 哪些组件参与了这个&如果你有任何阅读/观看的材料,我可以用来完成这一点。

谢谢 :)

编辑:

这些是我执行处理捏和旋转的方法:

func handlePinch(recognizer: UIPinchGestureRecognizer) { if let view = recognizer.view as? UILabel { view.transform = CGAffineTransformScale(view.transform, recognizer.scale, recognizer.scale) } } func handleRotate(recognizer: UIRotationGestureRecognizer) { if let view = recognizer.view as? UILabel { view.transform = CGAffineTransformRotate(view.transform, recognizer.rotation) } } 

预览video,了解我如何实施这项工作: https : //drive.google.com/file/d/0B-AVM51jxsvUY2RUUHdWbGo5QlU/view?usp=sharing

在这里输入图像说明

find了一个解决scheme,显然我需要做的旋转和捏是总是重置视图的旋转/缩放。 例如,将我的Recognizer.scale设置为1.0,将recognizer.rotation设置为0.0。

这是我的代码的一个例子:

 func handlePan(recognizer: UIPanGestureRecognizer) { let translation = recognizer.translationInView(view) if let view = recognizer.view { view.center = CGPoint(x:view.center.x + translation.x, y:view.center.y + translation.y) } recognizer.setTranslation(CGPointZero, inView: view) } func handlePinch(recognizer: UIPinchGestureRecognizer) { if let view = recognizer.view as? UILabel { let pinchScale: CGFloat = recognizer.scale view.transform = CGAffineTransformScale(view.transform, pinchScale, pinchScale) recognizer.scale = 1.0 } } func handleRotate(recognizer: UIRotationGestureRecognizer) { if let view = recognizer.view as? UILabel { let rotation: CGFloat = recognizer.rotation view.transform = CGAffineTransformRotate(view.transform, rotation) recognizer.rotation = 0.0 } } 

对于“它以一种非常激进的方式太多地放大/缩小”:

您需要根据您的需要处理捏手势比例值。

从你的识别器的方法,你得到的比例值为:

  var pinchScale: CGFloat = recogniser.scale 

您需要修改此值,或者按照您的需要将其减less10/100,并在标签转换中使用此值,而不是使用pangesture标度。

你的问题是,你的代码采取当前的变换,并添加另一个基于当前“运动”的变换,所以当你在一个单一的手势移动时,你积累的变化(真正的复合)。

保持实例variables的旋转,缩放和移动,更新每个手势识别器的动作中的相关动作(您还需要在每个手势的起始位置存储每个动作的状态,这样就可以将变化量应用于初始值状态),并使用这三个variables从头开始创build转换。 创build转换当然应该分解成一个单独的函数,因为你要多次使用它。

我不确定这是不是你正在寻找的(我从来没有使用过snapchat),但是这可能会给你一些想法

https://github.com/danielinoa/DIImageView

我不确定这是一个捏手势,但我不完全确定你是什么意思,无论如何使用。

这是该项目的演示: https : //www.cocoacontrols.com/controls/diimageview

一般来说,我build议每次尝试实施类似的东西时检查cocoacontrols。 通常有很好的例子让你开始,有时候,你会发现你需要什么。