我一直在尝试在图像上实现类似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
答案 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。通常有一些坚实的例子可以帮助您入门,有时,您会找到您需要的确切内容。