From 25e7818f5697781e12b4e993958c9fb2bf7cef27 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 14 Mar 2019 09:04:07 -0400 Subject: [PATCH] Ensure proper z-ordering of item layers. --- .../ImageEditor/ImageEditorCanvasView.swift | 17 +++++++++++++++-- .../Views/ImageEditor/ImageEditorContents.swift | 5 +++++ .../Views/ImageEditor/ImageEditorModel.swift | 5 +++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/SignalMessaging/Views/ImageEditor/ImageEditorCanvasView.swift b/SignalMessaging/Views/ImageEditor/ImageEditorCanvasView.swift index dba18ef70..72d5fe3f7 100644 --- a/SignalMessaging/Views/ImageEditor/ImageEditorCanvasView.swift +++ b/SignalMessaging/Views/ImageEditor/ImageEditorCanvasView.swift @@ -33,6 +33,8 @@ public class ImageEditorCanvasView: UIView { private static let brushLayerZ: CGFloat = +1 // We want text to be rendered above the image and strokes. private static let textLayerZ: CGFloat = +2 + // We leave space for 10k items/layers of each type. + private static let zPositionSpacing: CGFloat = 0.0001 @objc public required init(model: ImageEditorModel, @@ -470,11 +472,22 @@ public class ImageEditorCanvasView: UIView { shapeLayer.fillColor = nil shapeLayer.lineCap = kCALineCapRound shapeLayer.lineJoin = kCALineJoinRound - shapeLayer.zPosition = brushLayerZ + shapeLayer.zPosition = zPositionForItem(item: item, model: model, zPositionBase: brushLayerZ) return shapeLayer } + private class func zPositionForItem(item: ImageEditorItem, + model: ImageEditorModel, + zPositionBase: CGFloat) -> CGFloat { + let itemIds = model.itemIds() + guard let itemIndex = itemIds.firstIndex(of: item.itemId) else { + owsFailDebug("Couldn't find index of item.") + return zPositionBase + } + return zPositionBase + CGFloat(itemIndex) * zPositionSpacing + } + private class func textLayerForItem(item: ImageEditorTextItem, model: ImageEditorModel, transform: ImageEditorTransform, @@ -532,7 +545,7 @@ public class ImageEditorCanvasView: UIView { let transform = CGAffineTransform.identity.scaledBy(x: item.scaling, y: item.scaling).rotated(by: item.rotationRadians) layer.setAffineTransform(transform) - layer.zPosition = textLayerZ + layer.zPosition = zPositionForItem(item: item, model: model, zPositionBase: textLayerZ) return layer } diff --git a/SignalMessaging/Views/ImageEditor/ImageEditorContents.swift b/SignalMessaging/Views/ImageEditor/ImageEditorContents.swift index e62d1b3d1..8725ba433 100644 --- a/SignalMessaging/Views/ImageEditor/ImageEditorContents.swift +++ b/SignalMessaging/Views/ImageEditor/ImageEditorContents.swift @@ -74,4 +74,9 @@ public class ImageEditorContents: NSObject { public func items() -> [ImageEditorItem] { return itemMap.orderedValues() } + + @objc + public func itemIds() -> [String] { + return itemMap.orderedKeys + } } diff --git a/SignalMessaging/Views/ImageEditor/ImageEditorModel.swift b/SignalMessaging/Views/ImageEditor/ImageEditorModel.swift index ed33cdfe4..38cea34de 100644 --- a/SignalMessaging/Views/ImageEditor/ImageEditorModel.swift +++ b/SignalMessaging/Views/ImageEditor/ImageEditorModel.swift @@ -114,6 +114,11 @@ public class ImageEditorModel: NSObject { return contents.items() } + @objc + public func itemIds() -> [String] { + return contents.itemIds() + } + @objc public func has(itemForId itemId: String) -> Bool { return item(forId: itemId) != nil