首页 文章

图像上类似Snapchat的文字

提问于
浏览
6

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

我已经设法实现了Pan方法,但是我很难让Pinch Rotation像他们一样平滑,我得到了可怕的结果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)
    }
}

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

enter image description here

4 回答

  • 4

    找到一个解决方案,显然我需要在Rotation&Pinch中做的就是始终重置视图的旋转/比例 . 例如,将我的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
        }
    }
    
  • 0

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

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

    根据您的识别器方法,您可以获得比例值:

    var pinchScale: CGFloat = recogniser.scale
    

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

  • 1

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

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

  • 1

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

    https://github.com/danielinoa/DIImageView

    我不确定这个有一个捏手势,但我不完全确定你的意思是如何使用它 .

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

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

相关问题