图像上类似Snapchat的文字

时间:2015-12-22 15:06:46

标签: ios swift uigesturerecognizer

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

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

你们怎么看待这个?哪个组件涉及此&如果你有任何阅读/观看材料,我可以用来完成这个。

谢谢:)

编辑:

这些是我实施的处理Pinch& amp;的方法。旋转:

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)
    }
}

预览我实施的捏合工作的视频: https://drive.google.com/file/d/0B-AVM51jxsvUY2RUUHdWbGo5QlU/view?usp=sharing

enter image description here

4 个答案:

答案 0 :(得分:4)

找到了一个解决方案,显然我只需要在Rotation&捏合始终重置视图的旋转/比例。 例如,将我的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
    }
}

答案 1 :(得分:1)

对于“它以非常激进的方式向上/向下扩展”:

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

通过识别器方法,您可以将比例值设为:

    var pinchScale: CGFloat = recogniser.scale

您需要修改此值,例如根据需要将其减少/ 10或/ 100,并在标签转换中使用此值,而不是使用pangesture scale。

答案 2 :(得分:1)

您遇到的问题是您的代码采用当前变换并根据当前“移动”添加另一个变换,因此您可以在单个手势中移动时累积更改(实际上是复合变换)。

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

答案 3 :(得分:0)

我不确定这是不是你正在寻找的(我从未使用过Snapchat),但这可以给你一些想法

https://github.com/danielinoa/DIImageView

我不确定这个有一个捏手势,但我不完全确定你的意思,无论如何都要使用它。

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

一般来说,我建议每次冒险实施这样的事情时检查cocoacontrols。通常有一些坚实的例子可以帮助您入门,有时,您会找到您需要的确切内容。