|
@@ -3,9 +3,20 @@ import UIKit
|
|
|
|
|
|
class PreviewController: QLPreviewController {
|
|
class PreviewController: QLPreviewController {
|
|
|
|
|
|
|
|
+ struct QLToolbar {
|
|
|
|
+ let toolbar: UIToolbar
|
|
|
|
+ let shareButton: UIBarButtonItem?
|
|
|
|
+ let listButton: UIBarButtonItem?
|
|
|
|
+ }
|
|
|
|
+
|
|
var urls: [URL]
|
|
var urls: [URL]
|
|
|
|
|
|
- // we use this toolbar to hide the default toolbar
|
|
|
|
|
|
+ private lazy var doneButtonItem: UIBarButtonItem = {
|
|
|
|
+ let button = UIBarButtonItem(title: String.localized("done"), style: .done, target: self, action: #selector(doneButtonPressed(_:)))
|
|
|
|
+ return button
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ // we use this toolbar to cover the default toolbar
|
|
lazy var customToolbar: UIToolbar = {
|
|
lazy var customToolbar: UIToolbar = {
|
|
let toolbar = UIToolbar()
|
|
let toolbar = UIToolbar()
|
|
let shareItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareButtonTapped(_:)))
|
|
let shareItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareButtonTapped(_:)))
|
|
@@ -13,8 +24,7 @@ class PreviewController: QLPreviewController {
|
|
return toolbar
|
|
return toolbar
|
|
}()
|
|
}()
|
|
|
|
|
|
- var qlToolbar: UIToolbar? // the native toolbar
|
|
|
|
- var qlShareButton: UIBarButtonItem? // the native shareButton
|
|
|
|
|
|
+ var qlToolbarCopy: QLToolbar? // object that holds references to native qlToolbar
|
|
|
|
|
|
var customToolbarLeadingConstraint: NSLayoutConstraint?
|
|
var customToolbarLeadingConstraint: NSLayoutConstraint?
|
|
var customToolbarTrailingConstraint: NSLayoutConstraint?
|
|
var customToolbarTrailingConstraint: NSLayoutConstraint?
|
|
@@ -28,11 +38,6 @@ class PreviewController: QLPreviewController {
|
|
&& customToolbarBottomConstraint != nil
|
|
&& customToolbarBottomConstraint != nil
|
|
}
|
|
}
|
|
|
|
|
|
- private lazy var doneButtonItem: UIBarButtonItem = {
|
|
|
|
- let button = UIBarButtonItem(title: String.localized("done"), style: .done, target: self, action: #selector(doneButtonPressed(_:)))
|
|
|
|
- return button
|
|
|
|
- }()
|
|
|
|
-
|
|
|
|
init(currentIndex: Int, urls: [URL]) {
|
|
init(currentIndex: Int, urls: [URL]) {
|
|
self.urls = urls
|
|
self.urls = urls
|
|
super.init(nibName: nil, bundle: nil)
|
|
super.init(nibName: nil, bundle: nil)
|
|
@@ -55,21 +60,21 @@ class PreviewController: QLPreviewController {
|
|
}
|
|
}
|
|
|
|
|
|
@objc private func shareButtonTapped(_ sender: UIBarButtonItem) {
|
|
@objc private func shareButtonTapped(_ sender: UIBarButtonItem) {
|
|
- guard let defaultShareButton = self.qlShareButton else { return }
|
|
|
|
- // execute action of nativeShareButton
|
|
|
|
|
|
+ guard let defaultShareButton = self.qlToolbarCopy?.shareButton else { return }
|
|
|
|
+ // trigger action of nativeShareButton
|
|
_ = defaultShareButton.target?.perform(defaultShareButton.action, with: nil)
|
|
_ = defaultShareButton.target?.perform(defaultShareButton.action, with: nil)
|
|
}
|
|
}
|
|
|
|
|
|
private func layoutCustumToolbarIfNeeded() {
|
|
private func layoutCustumToolbarIfNeeded() {
|
|
- guard let defaultToolbar = qlToolbar else {
|
|
|
|
|
|
+ guard let nativeToolbar = qlToolbarCopy?.toolbar else {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
if !customToolbarHasLayout {
|
|
if !customToolbarHasLayout {
|
|
customToolbar.translatesAutoresizingMaskIntoConstraints = false
|
|
customToolbar.translatesAutoresizingMaskIntoConstraints = false
|
|
- customToolbarLeadingConstraint = customToolbar.leadingAnchor.constraint(equalTo: defaultToolbar.leadingAnchor, constant: 0)
|
|
|
|
- customToolbarTopConstraint = customToolbar.topAnchor.constraint(equalTo: defaultToolbar.topAnchor, constant: 0)
|
|
|
|
- customToolbarTrailingConstraint = customToolbar.trailingAnchor.constraint(equalTo: defaultToolbar.trailingAnchor, constant: 0)
|
|
|
|
- customToolbarBottomConstraint = customToolbar.bottomAnchor.constraint(equalTo: defaultToolbar.bottomAnchor, constant: 0)
|
|
|
|
|
|
+ customToolbarLeadingConstraint = customToolbar.leadingAnchor.constraint(equalTo: nativeToolbar.leadingAnchor, constant: 0)
|
|
|
|
+ customToolbarTopConstraint = customToolbar.topAnchor.constraint(equalTo: nativeToolbar.topAnchor, constant: 0)
|
|
|
|
+ customToolbarTrailingConstraint = customToolbar.trailingAnchor.constraint(equalTo: nativeToolbar.trailingAnchor, constant: 0)
|
|
|
|
+ customToolbarBottomConstraint = customToolbar.bottomAnchor.constraint(equalTo: nativeToolbar.bottomAnchor, constant: 0)
|
|
[
|
|
[
|
|
customToolbarLeadingConstraint, customToolbarTopConstraint, customToolbarTrailingConstraint, customToolbarBottomConstraint
|
|
customToolbarLeadingConstraint, customToolbarTopConstraint, customToolbarTrailingConstraint, customToolbarBottomConstraint
|
|
].forEach { $0?.isActive = true }
|
|
].forEach { $0?.isActive = true }
|
|
@@ -78,17 +83,42 @@ class PreviewController: QLPreviewController {
|
|
|
|
|
|
override func viewWillAppear(_ animated: Bool) {
|
|
override func viewWillAppear(_ animated: Bool) {
|
|
super.viewWillAppear(animated)
|
|
super.viewWillAppear(animated)
|
|
- // native toolbar is accessable after viewWillAppear
|
|
|
|
- qlToolbar = traverseSearchToolbar(root: self.view)
|
|
|
|
|
|
+ // native toolbar is accessable just on and after viewWillAppear
|
|
|
|
+ qlToolbarCopy = traverseSearchToolbar(root: self.view)
|
|
layoutCustumToolbarIfNeeded()
|
|
layoutCustumToolbarIfNeeded()
|
|
|
|
+ hideListButtonInNavigationBarIfNeeded()
|
|
}
|
|
}
|
|
|
|
|
|
- private func traverseSearchToolbar(root: UIView) -> UIToolbar? {
|
|
|
|
|
|
+ override func viewDidAppear(_ animated: Bool) {
|
|
|
|
+ traverseSearchToolbar(root: self.view)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // MARK: - customisation
|
|
|
|
+ private func traverseSearchToolbar(root: UIView) -> QLToolbar? {
|
|
|
|
+
|
|
|
|
+ let toolbarIdentifier = "QLCustomToolBarModalAccessibilityIdentifier"
|
|
|
|
+ let shareIdentifier = "QLOverlayDefaultActionButtonAccessibilityIdentifier"
|
|
|
|
+
|
|
if let toolbar = root as? UIToolbar, let items = toolbar.items {
|
|
if let toolbar = root as? UIToolbar, let items = toolbar.items {
|
|
- if items.count == 3 {
|
|
|
|
|
|
+ if toolbar.accessibilityIdentifier == toolbarIdentifier {
|
|
// share item, flex item, list item
|
|
// share item, flex item, list item
|
|
- self.qlShareButton = items[0] // we need the share button to trigger share events
|
|
|
|
- return toolbar
|
|
|
|
|
|
+ var shareButton: UIBarButtonItem?
|
|
|
|
+ var listButton: UIBarButtonItem?
|
|
|
|
+ for item in items {
|
|
|
|
+ if item.accessibilityIdentifier == shareIdentifier {
|
|
|
|
+ shareButton = item
|
|
|
|
+ } else if item.accessibilityIdentifier == "QLOverlayListButtonAccessibilityIdentifier" {
|
|
|
|
+ listButton = item
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if listButton == nil {
|
|
|
|
+ // if there is no list button we can leave the bar (ipads)
|
|
|
|
+ return nil
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return QLToolbar(toolbar: toolbar, shareButton: shareButton, listButton: listButton)
|
|
|
|
+ } else {
|
|
|
|
+ print(toolbar)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if root.subviews.isEmpty {
|
|
if root.subviews.isEmpty {
|
|
@@ -106,6 +136,11 @@ class PreviewController: QLPreviewController {
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private func hideListButtonInNavigationBarIfNeeded() {
|
|
|
|
+ let items = navigationItem.leftBarButtonItems
|
|
|
|
+ print(items)
|
|
|
|
+ }
|
|
|
|
+
|
|
// MARK: - actions
|
|
// MARK: - actions
|
|
@objc private func doneButtonPressed(_ sender: UIBarButtonItem) {
|
|
@objc private func doneButtonPressed(_ sender: UIBarButtonItem) {
|
|
self.dismiss(animated: true, completion: nil)
|
|
self.dismiss(animated: true, completion: nil)
|