如何通过拖动来移动图层?

Posted

技术标签:

【中文标题】如何通过拖动来移动图层?【英文标题】:how to move a layer by dragging? 【发布时间】:2017-01-24 14:43:29 【问题描述】:

将 CATextLayer 添加到 UIImageView 图层后如何通过拖动来移动图层。因为我将向 UIImageView 添加多个图层。那么,我如何知道我点击了哪个图层并将其移动到另一个位置?

这是我绘制文本的代码:

func addText() -> CATextLayer
    let rect:CGRect = CGRect(x: 50, y: 600, width: 120, height: 60)
    let myAttributes = [
                        NSFontAttributeName: UIFont(name: "HelveticaNeue-Thin", size:18)!,
                        NSForegroundColorAttributeName: UIColor.black.cgColor
                        ] as [String : Any]
    let myAttributedString = NSAttributedString(string: "TEST STRING", attributes: myAttributes)

    let textLayer = CATextLayer()
    textLayer.frame = rect
    textLayer.string = myAttributedString
    textLayer.position = CGPoint(x:150,y:400)
    textLayer.alignmentMode = kCAAlignmentCenter
    return textLayer

【问题讨论】:

我已经解决了使用自定义视图的问题并定义了事件处理程序来控制拖动。 【参考方案1】:

UIGestureRecognizerhitTest() 是要走的路:

@IBOutlet weak var imageView: ImageView!
let panGesture = UIPanGestureRecognizer()
var newLayer = CATextLayer()

// this is your code above, be careful, you want each layer "named"!
nextLayer = addText()

imageView.layer.addSubLayer(nextLayer)
imageView.addGestureRecognizer(panGesture)

func moveLayer(_ recognizer:UIPanGestureRecognizer) 
    let p = recognizer.location(in: self)
    if newLayer.hitTest(p) != nil 
        newLayer.position = p
    

就是这样。我的代码是一个骨架,我假设您想要 imageView 中的图层。但如果你愿意,它们可以成为 superview 的一部分。

同样,请注意设置图层的方式 - 如果要移动多个图层,则需要专门访问它们。我的代码是尝试使用您的功能。也许您可以将图层存储在一个数组中(如果您不知道会有多少),或者作为全局变量存储到 imageView 或视图控制器。

【讨论】:

感谢您的回复。但是如果 2 个图层重叠在同一个位置,哪个图层会被移动? 其实我想实现这样的绘制文字功能youtu.be/qdtzZGn7NaM?t=14m2s文字周围有一个边框形状,用户可以拖动,编辑或删除它。是否可以解决layer的使用问题?

以上是关于如何通过拖动来移动图层?的主要内容,如果未能解决你的问题,请参考以下文章

添加到拖动图层后,鼠标拖动停止工作

web切图的几个快捷键及总结

ps:图层知识

arcgis移动了图层并保存了图层上的点不在原来位置

PS简单切图小技巧

AE中如何将一个图层设置为另一个图层的遮罩层