【问题标题】:add textview as a sublayer of an image ios swift将textview添加为图像ios swift的子层
【发布时间】:2018-12-19 11:02:17
【问题描述】:
let ss = CATextLayer()
  ss.frame = rect
  ss.backgroundColor = UIColor.blue.cgColor
  ss.foregroundColor = UIColor.cyan.cgColor
  ss.string = mytextView.text
  myImage.layer.addSublayer(ss)

我正在尝试将可编辑的文本视图添加为图像视图的子层。问题是,我无法编辑,也无法为此文本层添加手势识别器。我怎样才能让这个 textlayer 完全像 textview 一样。

【问题讨论】:

    标签: ios swift3 uiimageview textview catextlayer


    【解决方案1】:

    只需使用UITextViewUITextField 并将其作为子视图添加到UIImageView,类似于:

    let textView = UITextView()
    //configure text view like you want
    //add constraints or size it as you want
    myImage.addSubview(textView)
    

    记住UIImageView 只是UIView 的另一个子类,因此您可以像普通UIView 一样向其中添加子视图。


    继续您正在处理的内容,因为您添加的一些视图是 CALayers,有些是 UIViews 或两者的子类(例如,UITextViewUIView 子类)

    我会在你的类中添加两个属性:

    var addedViews = [Any]()
    var undoStack = [Any]()
    

    我知道这不太像 Swift,因为你可以在这两个 arrays 中放入任何东西,但仍然可以。

    然后当您创建一个新的layerview 时,您还将它添加到addedViews 数组中:

    let layer = CAShapeLayer()
    layer.frame = CGRect(x: 30, y: 30, width: 100, height: 100)
    layer.backgroundColor = UIColor.red.cgColor
    layer.transform = CATransform3DMakeRotation(0.2, 0, 0, 1)
    addedViews.append(layer)
    

    所以addedViews 数组将保存对您添加的所有视图的引用,因此当您撤消时,您可以执行以下操作:

    if let viewLayer = addedViews.last {
        if let view = viewLayer as? UIView {
            view.removeFromSuperview()
        } else if let layer = viewLayer as? CALayer {
            layer.removeFromSuperlayer()
        }
    
        undoStack.append(viewLayer)
        addedViews.removeLast()
    }
    

    如果您想重做更改,请执行相同的操作,但您会从 undoStack 获得最后一个视图,如下所示:

    if let viewLayer = undoStack.last {
        if let view = viewLayer as? UIView {
            self.view.addSubview(view)
        } else if let layer = viewLayer as? CALayer {
            view.layer.addSublayer(layer)
        }
    
        addedViews.append(viewLayer)
        undoStack.removeLast()
    }
    

    【讨论】:

    • 我也是这样做的。但问题是我也使用 cashapelayers 作为同一图像的子层。当我撤消最后一层时,子视图会导致错误。
    • 你做什么?你能再解释一下吗,我不知道cashapelayers是什么,你说的undo the last layer是什么意思
    • 我正在制作一个图像编辑器。所以我在图像上添加图层。它的。具有撤消和重做功能。因此,当我执行撤消功能时,子视图和子层的行为不同。我正在删除最后添加的图层,但子视图没有被删除。
    • 为什么不添加所有视图的数组 - 可以是视图和图层,然后当您需要撤消时,只需添加最后一个并将其删除
    • 我只是这样做。我正在像这样删除图层, var c = documentImage.layer.sublayers?.count sublayerarray.append(documentImage.layer.sublayers![c!-1]) Myimage.layer.sublayers?.remove(at:c! - 1)
    猜你喜欢
    • 2015-04-22
    • 2014-12-02
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多