From efa06f05fbabda4bd9794c88dfa42fef199214e2 Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Tue, 16 Mar 2021 11:13:56 -0600 Subject: [PATCH 1/8] Resize views to constrain to provided aspect ratio --- Classes/Editor/EditorView.swift | 46 ++++++++++++++++------- Classes/Editor/EditorViewController.swift | 1 + Classes/Settings/CameraSettings.swift | 3 ++ 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/Classes/Editor/EditorView.swift b/Classes/Editor/EditorView.swift index 9862fe4ca..dad2ee39e 100644 --- a/Classes/Editor/EditorView.swift +++ b/Classes/Editor/EditorView.swift @@ -187,10 +187,10 @@ final class EditorView: UIView, MovableViewCanvasDelegate, MediaPlayerViewDelega private lazy var drawingCanvasConstraints: FullViewConstraints = { return FullViewConstraints( view: drawingCanvas, - top: drawingCanvas.topAnchor.constraint(equalTo: topAnchor), - bottom: drawingCanvas.bottomAnchor.constraint(equalTo: bottomAnchor), - leading: drawingCanvas.leadingAnchor.constraint(equalTo: leadingAnchor), - trailing: drawingCanvas.trailingAnchor.constraint(equalTo: trailingAnchor) + top: drawingCanvas.topAnchor.constraint(equalTo: playerView?.topAnchor ?? topAnchor), + bottom: drawingCanvas.bottomAnchor.constraint(equalTo: playerView?.bottomAnchor ?? bottomAnchor), + leading: drawingCanvas.leadingAnchor.constraint(equalTo: playerView?.leadingAnchor ?? leadingAnchor), + trailing: drawingCanvas.trailingAnchor.constraint(equalTo: playerView?.trailingAnchor ?? trailingAnchor) ) }() @@ -199,10 +199,10 @@ final class EditorView: UIView, MovableViewCanvasDelegate, MediaPlayerViewDelega private lazy var movableViewCanvasConstraints = { return FullViewConstraints( view: movableViewCanvas, - top: movableViewCanvas.topAnchor.constraint(equalTo: topAnchor), - bottom: movableViewCanvas.bottomAnchor.constraint(equalTo: bottomAnchor), - leading: movableViewCanvas.leadingAnchor.constraint(equalTo: leadingAnchor), - trailing: movableViewCanvas.trailingAnchor.constraint(equalTo: trailingAnchor) + top: movableViewCanvas.topAnchor.constraint(equalTo: playerView?.topAnchor ?? topAnchor), + bottom: movableViewCanvas.bottomAnchor.constraint(equalTo: playerView?.bottomAnchor ?? bottomAnchor), + leading: movableViewCanvas.leadingAnchor.constraint(equalTo: playerView?.leadingAnchor ?? leadingAnchor), + trailing: movableViewCanvas.trailingAnchor.constraint(equalTo: playerView?.trailingAnchor ?? trailingAnchor) ) }() @@ -222,6 +222,7 @@ final class EditorView: UIView, MovableViewCanvasDelegate, MediaPlayerViewDelega weak var delegate: EditorViewDelegate? private var mediaContentMode: UIView.ContentMode + private var aspectRatio: CGFloat? @available(*, unavailable, message: "use init() instead") required public init?(coder aDecoder: NSCoder) { @@ -239,6 +240,7 @@ final class EditorView: UIView, MovableViewCanvasDelegate, MediaPlayerViewDelega showQuickPostButton: Bool, showBlogSwitcher: Bool, confirmAtTop: Bool, + aspectRatio: CGFloat?, quickBlogSelectorCoordinator: KanvasQuickBlogSelectorCoordinating?, tagCollection: UIView?, metalContext: MetalContext?, @@ -255,6 +257,7 @@ final class EditorView: UIView, MovableViewCanvasDelegate, MediaPlayerViewDelega self.showQuickPostButton = showQuickPostButton self.showBlogSwitcher = showBlogSwitcher self.confirmAtTop = confirmAtTop + self.aspectRatio = aspectRatio self.quickBlogSelectorCoordinator = quickBlogSelectorCoordinator self.tagCollection = tagCollection self.metalContext = metalContext @@ -327,7 +330,24 @@ final class EditorView: UIView, MovableViewCanvasDelegate, MediaPlayerViewDelega private func setupPlayer() { let playerView = MediaPlayerView(metalContext: metalContext, mediaContentMode: mediaContentMode) playerView.delegate = self - playerView.add(into: self) + + if let aspectRatio = aspectRatio { + playerView.translatesAutoresizingMaskIntoConstraints = false + self.addSubview(playerView) + + let topConstraint = playerView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor) + topConstraint.priority = .defaultHigh + NSLayoutConstraint.activate([ + playerView.leadingAnchor.constraint(equalTo: leadingAnchor), + playerView.trailingAnchor.constraint(equalTo: trailingAnchor), + playerView.widthAnchor.constraint(equalTo: playerView.heightAnchor, multiplier: aspectRatio, constant: 0), + topConstraint, + playerView.bottomAnchor.constraint(lessThanOrEqualTo: bottomAnchor) + ]) + } else { + playerView.add(into: self) + } + self.playerView = playerView } @@ -560,10 +580,10 @@ final class EditorView: UIView, MovableViewCanvasDelegate, MediaPlayerViewDelega addSubview(textMenuContainer) NSLayoutConstraint.activate([ - textMenuContainer.leadingAnchor.constraint(equalTo: leadingAnchor), - textMenuContainer.trailingAnchor.constraint(equalTo: trailingAnchor), - textMenuContainer.topAnchor.constraint(equalTo: topAnchor), - textMenuContainer.bottomAnchor.constraint(equalTo: bottomAnchor) + textMenuContainer.leadingAnchor.constraint(equalTo: playerView?.leadingAnchor ?? leadingAnchor), + textMenuContainer.trailingAnchor.constraint(equalTo: playerView?.trailingAnchor ?? trailingAnchor), + textMenuContainer.topAnchor.constraint(equalTo: playerView?.topAnchor ?? topAnchor), + textMenuContainer.bottomAnchor.constraint(equalTo: playerView?.bottomAnchor ?? bottomAnchor) ]) } diff --git a/Classes/Editor/EditorViewController.swift b/Classes/Editor/EditorViewController.swift index a89440169..f6b2ba9c1 100644 --- a/Classes/Editor/EditorViewController.swift +++ b/Classes/Editor/EditorViewController.swift @@ -241,6 +241,7 @@ public final class EditorViewController: UIViewController, MediaPlayerController showQuickPostButton: settings.showQuickPostButtonInEditor, showBlogSwitcher: settings.showBlogSwitcherInEditor, confirmAtTop: settings.features.editorConfirmAtTop, + aspectRatio: settings.aspectRatio, quickBlogSelectorCoordinator: quickBlogSelectorCoordinator, tagCollection: tagCollection, metalContext: metalContext, diff --git a/Classes/Settings/CameraSettings.swift b/Classes/Settings/CameraSettings.swift index 0b38e3ce3..ead7f7290 100644 --- a/Classes/Settings/CameraSettings.swift +++ b/Classes/Settings/CameraSettings.swift @@ -312,6 +312,9 @@ public struct CameraFeatures { /// The Font Selector button uses the currently selected font for its label public var fontSelectorUsesFont: Bool = DefaultCameraSettings.fontFamilyUsesFont + /// The aspect ratio to pin the Editor View to + public var aspectRatio: CGFloat? = nil + override public init() { } } From 00b9a66346ab959b61061b1efee90ec1b188710f Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Tue, 16 Mar 2021 11:14:30 -0600 Subject: [PATCH 2/8] Calculate export size based on player's size This matches what the user sees displayed. --- Classes/Editor/EditorView.swift | 5 +++++ Classes/Editor/EditorViewController.swift | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Classes/Editor/EditorView.swift b/Classes/Editor/EditorView.swift index dad2ee39e..5ee0374b4 100644 --- a/Classes/Editor/EditorView.swift +++ b/Classes/Editor/EditorView.swift @@ -133,6 +133,11 @@ final class EditorView: UIView, MovableViewCanvasDelegate, MediaPlayerViewDelega weak var playerView: MediaPlayerView? + var exportSize: CGSize { + let exportView = playerView ?? self + return CGSize(width: exportView.bounds.width * exportView.contentScaleFactor, height: exportView.bounds.height * exportView.contentScaleFactor) + } + private let mainActionMode: MainActionMode private let confirmButton = UIButton() private let closeButton = UIButton() diff --git a/Classes/Editor/EditorViewController.swift b/Classes/Editor/EditorViewController.swift index f6b2ba9c1..40bce8786 100644 --- a/Classes/Editor/EditorViewController.swift +++ b/Classes/Editor/EditorViewController.swift @@ -813,7 +813,8 @@ public final class EditorViewController: UIViewController, MediaPlayerController } private var exportSize: CGSize? { - return settings.features.scaleMediaToFill ? CGSize(width: editorView.frame.width * editorView.contentScaleFactor, height: editorView.frame.height * editorView.contentScaleFactor) : nil + let exportSize = editorView.exportSize + return settings.features.scaleMediaToFill ? exportSize : nil } private func createFinalGIF(segments: [CameraSegment], mediaInfo: MediaInfo, archive: Data, exportAction: KanvasExportAction) { From 443c5f6ea9b788c99fc3ff973d125557eb1fdb37 Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Tue, 16 Mar 2021 11:15:03 -0600 Subject: [PATCH 3/8] Fix canvas resize when display rect is updated The display rect of the media is not relevant for scaleToFill media since it will fill the provided space. --- Classes/Editor/EditorView.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Classes/Editor/EditorView.swift b/Classes/Editor/EditorView.swift index 5ee0374b4..6973d09b8 100644 --- a/Classes/Editor/EditorView.swift +++ b/Classes/Editor/EditorView.swift @@ -120,8 +120,12 @@ private struct EditorViewConstants { final class EditorView: UIView, MovableViewCanvasDelegate, MediaPlayerViewDelegate { func didRenderRectChange(rect: CGRect) { - drawingCanvasConstraints.update(with: rect) - movableViewCanvasConstraints.update(with: rect) + if playerView?.contentMode != .scaleToFill { + // Any content mode which isn't explicitly filling the frame needs to adjust the drawing / canvas area + // Since `scaleToFill` always fills the provided frame, leave sizing alone since they match rendering area at setup. + drawingCanvasConstraints.update(with: rect) + movableViewCanvasConstraints.update(with: rect) + } delegate?.didRenderRectChange(rect: rect) } From 6c2abc408e640f22761ef843a3c94fc5bd9fb69a Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Tue, 16 Mar 2021 13:41:09 -0600 Subject: [PATCH 4/8] Tweak positioning for Player View --- Classes/Editor/EditorView.swift | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Classes/Editor/EditorView.swift b/Classes/Editor/EditorView.swift index 6973d09b8..d06bab012 100644 --- a/Classes/Editor/EditorView.swift +++ b/Classes/Editor/EditorView.swift @@ -341,16 +341,27 @@ final class EditorView: UIView, MovableViewCanvasDelegate, MediaPlayerViewDelega playerView.delegate = self if let aspectRatio = aspectRatio { + playerView.layer.masksToBounds = true + playerView.layer.cornerRadius = 12 playerView.translatesAutoresizingMaskIntoConstraints = false self.addSubview(playerView) - let topConstraint = playerView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor) - topConstraint.priority = .defaultHigh + let bottomConstraint: NSLayoutConstraint + let topConstraint: NSLayoutConstraint + if Device.belongsToIPhoneXGroup { + bottomConstraint = playerView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor) + topConstraint = playerView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor) + } else { + bottomConstraint = playerView.bottomAnchor.constraint(equalTo: bottomAnchor) + topConstraint = playerView.topAnchor.constraint(equalTo: topAnchor) + } NSLayoutConstraint.activate([ - playerView.leadingAnchor.constraint(equalTo: leadingAnchor), - playerView.trailingAnchor.constraint(equalTo: trailingAnchor), + playerView.centerXAnchor.constraint(equalTo: centerXAnchor), + playerView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor), + playerView.trailingAnchor.constraint(lessThanOrEqualTo: trailingAnchor), playerView.widthAnchor.constraint(equalTo: playerView.heightAnchor, multiplier: aspectRatio, constant: 0), topConstraint, + bottomConstraint, playerView.bottomAnchor.constraint(lessThanOrEqualTo: bottomAnchor) ]) } else { @@ -549,7 +560,7 @@ final class EditorView: UIView, MovableViewCanvasDelegate, MediaPlayerViewDelega let verticalPositioning: [NSLayoutConstraint] if confirmAtTop { - verticalPositioning = [collectionContainer.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor)] + verticalPositioning = [collectionContainer.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor, constant: -KanvasEditorDesign.shared.editorViewButtonBottomMargin)] } else { verticalPositioning = [collectionContainer.centerYAnchor.constraint(equalTo: confirmOrPostButton().centerYAnchor)] } From 27e9f48a8009191e98c4eb1d4fb554d96d2b197a Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Fri, 2 Apr 2021 09:40:12 -0600 Subject: [PATCH 5/8] Fix text positioning w/ aspect ratio --- Classes/Editor/EditorView.swift | 8 ++++---- Classes/Editor/Text/EditorTextController.swift | 7 ++++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Classes/Editor/EditorView.swift b/Classes/Editor/EditorView.swift index d06bab012..d48324383 100644 --- a/Classes/Editor/EditorView.swift +++ b/Classes/Editor/EditorView.swift @@ -615,10 +615,10 @@ final class EditorView: UIView, MovableViewCanvasDelegate, MediaPlayerViewDelega addSubview(drawingMenuContainer) drawingMenuContainer.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ - drawingMenuContainer.leadingAnchor.constraint(equalTo: leadingAnchor), - drawingMenuContainer.trailingAnchor.constraint(equalTo: trailingAnchor), - drawingMenuContainer.topAnchor.constraint(equalTo: topAnchor), - drawingMenuContainer.bottomAnchor.constraint(equalTo: bottomAnchor) + drawingMenuContainer.leadingAnchor.constraint(equalTo: playerView?.leadingAnchor ?? leadingAnchor), + drawingMenuContainer.trailingAnchor.constraint(equalTo: playerView?.trailingAnchor ?? trailingAnchor), + drawingMenuContainer.topAnchor.constraint(equalTo: playerView?.topAnchor ?? topAnchor), + drawingMenuContainer.bottomAnchor.constraint(equalTo: playerView?.bottomAnchor ?? bottomAnchor) ]) } diff --git a/Classes/Editor/Text/EditorTextController.swift b/Classes/Editor/Text/EditorTextController.swift index eb3f7afc6..153548b50 100644 --- a/Classes/Editor/Text/EditorTextController.swift +++ b/Classes/Editor/Text/EditorTextController.swift @@ -269,7 +269,12 @@ final class EditorTextController: UIViewController, EditorTextViewDelegate, Colo @objc func keyboardWillShow(notification: NSNotification) { if let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue { let keyboardRectangle = keyboardFrame.cgRectValue - textView.moveToolsUp(distance: keyboardRectangle.height) + + let bottom = CGPoint(x: view.frame.minX, y: view.frame.maxY) + let difference = keyboardRectangle.maxY - view.convert(bottom, to: nil).y + + let heightDiff = keyboardRectangle.height - difference + textView.moveToolsUp(distance: heightDiff) } } From 8d93a0c8ec79003995655ceb9468c500cfbe9c88 Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Thu, 8 Apr 2021 12:59:36 -0600 Subject: [PATCH 6/8] Fix EditorView unit test --- KanvasExample/KanvasExampleTests/Editor/EditorViewTests.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/KanvasExample/KanvasExampleTests/Editor/EditorViewTests.swift b/KanvasExample/KanvasExampleTests/Editor/EditorViewTests.swift index 4861947f4..9039df9eb 100644 --- a/KanvasExample/KanvasExampleTests/Editor/EditorViewTests.swift +++ b/KanvasExample/KanvasExampleTests/Editor/EditorViewTests.swift @@ -32,6 +32,7 @@ final class EditorViewTests: FBSnapshotTestCase { showQuickPostButton: false, showBlogSwitcher: false, confirmAtTop: false, + aspectRatio: nil, quickBlogSelectorCoordinator: nil, tagCollection: nil, metalContext: nil, From cf5f5d22d067818264f31f50755de8facc6ff1fc Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Thu, 8 Apr 2021 13:17:28 -0600 Subject: [PATCH 7/8] Update example test version --- KanvasExample/Podfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KanvasExample/Podfile.lock b/KanvasExample/Podfile.lock index 11ecfdb6e..64d4e0664 100644 --- a/KanvasExample/Podfile.lock +++ b/KanvasExample/Podfile.lock @@ -4,7 +4,7 @@ PODS: - FBSnapshotTestCase/Core (2.1.4) - FBSnapshotTestCase/SwiftSupport (2.1.4): - FBSnapshotTestCase/Core - - Kanvas (1.2.3) + - Kanvas (1.2.4) DEPENDENCIES: - FBSnapshotTestCase (= 2.1.4) @@ -20,7 +20,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: FBSnapshotTestCase: 094f9f314decbabe373b87cc339bea235a63e07a - Kanvas: 97860c54ea07119c533a80d951ee8c1b39d8f386 + Kanvas: 0e1acb8c10e15eea3365f16c086de2443c7703a8 PODFILE CHECKSUM: 14b28dd726149c0d01dba9154d5bb095d9ba6a18 From 7ceaa367f03efb982dc666d8c47ede7527fc904e Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Mon, 12 Apr 2021 11:37:45 -0600 Subject: [PATCH 8/8] Increment Kanvas version + update example project --- Kanvas.podspec | 2 +- KanvasExample/Podfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Kanvas.podspec b/Kanvas.podspec index 3761eb2e7..9afc5235b 100644 --- a/Kanvas.podspec +++ b/Kanvas.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = "Kanvas" - spec.version = "1.2.5" + spec.version = "1.2.6" spec.summary = "A custom camera built for iOS." spec.homepage = "https://github.com/tumblr/kanvas-ios" spec.license = "MPLv2" diff --git a/KanvasExample/Podfile.lock b/KanvasExample/Podfile.lock index 64d4e0664..c2725dd07 100644 --- a/KanvasExample/Podfile.lock +++ b/KanvasExample/Podfile.lock @@ -4,7 +4,7 @@ PODS: - FBSnapshotTestCase/Core (2.1.4) - FBSnapshotTestCase/SwiftSupport (2.1.4): - FBSnapshotTestCase/Core - - Kanvas (1.2.4) + - Kanvas (1.2.6) DEPENDENCIES: - FBSnapshotTestCase (= 2.1.4) @@ -20,7 +20,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: FBSnapshotTestCase: 094f9f314decbabe373b87cc339bea235a63e07a - Kanvas: 0e1acb8c10e15eea3365f16c086de2443c7703a8 + Kanvas: 828033a062a8df8bd73e6efd1a09ac438ead4b41 PODFILE CHECKSUM: 14b28dd726149c0d01dba9154d5bb095d9ba6a18