Back/forward buttons, share button on iPad

This commit is contained in:
James Magahern
2020-07-31 14:08:10 -07:00
parent 6baf543da3
commit ad85c3dc23
6 changed files with 133 additions and 64 deletions

View File

@@ -12,6 +12,8 @@ class ToolbarButtonView: UIView
private var buttonPadding = CGFloat(24.0)
private var buttonViews: [UIView] = []
public var numberOfButtonViews: Int { buttonViews.count }
func addButtonView(_ button: UIView) {
buttonViews.append(button)
addSubview(button)
@@ -54,16 +56,19 @@ class ToolbarView: UIView
let containerView = UIView(frame: .zero)
let backgroundView = UIVisualEffectView(effect: UIBlurEffect(style: .systemThickMaterial))
let buttonsView = ToolbarButtonView(frame: .zero)
let cancelButton = UIButton(type: .system)
let leadingButtonsView = ToolbarButtonView(frame: .zero)
let trailingButtonsView = ToolbarButtonView(frame: .zero)
convenience init()
{
self.init(frame: .zero)
addSubview(backgroundView)
addSubview(containerView)
containerView.addSubview(buttonsView)
containerView.addSubview(leadingButtonsView)
containerView.addSubview(trailingButtonsView)
cancelButton.setTitle("Cancel", for: .normal)
containerView.addSubview(cancelButton)
@@ -97,25 +102,44 @@ class ToolbarView: UIView
cancelButton.frame = CGRect(origin: CGPoint(x: (containerView.bounds.maxX - cancelButtonSize.width), y: 0),
size: CGSize(width: cancelButtonSize.width, height: containerView.bounds.height))
// Toolbar buttons
let buttonContainerSize = buttonsView.sizeThatFits(containerView.bounds.size)
buttonsView.frame = CGRect(origin: CGPoint(x: (containerView.bounds.maxX - buttonContainerSize.width) + urlBarPadding, y: 0), size: buttonContainerSize)
// Leading toolbar buttons
if leadingButtonsView.numberOfButtonViews > 0 {
let leadingContainerSize = leadingButtonsView.sizeThatFits(containerView.bounds.size)
leadingButtonsView.frame = CGRect(origin: .zero, size: leadingContainerSize)
} else {
leadingButtonsView.frame = .zero
}
// Trailing toolbar buttons
let trailingContainerSize = trailingButtonsView.sizeThatFits(containerView.bounds.size)
trailingButtonsView.frame = CGRect(origin: CGPoint(x: (containerView.bounds.maxX - trailingContainerSize.width) + urlBarPadding, y: 0), size: trailingContainerSize)
var avoidingSize: CGSize = .zero
if cancelButtonVisible {
cancelButton.alpha = 1.0
buttonsView.alpha = 0.0
trailingButtonsView.alpha = 0.0
avoidingSize = cancelButtonSize
} else {
cancelButton.alpha = 0.0
buttonsView.alpha = 1.0
trailingButtonsView.alpha = 1.0
avoidingSize = buttonContainerSize
avoidingSize = trailingContainerSize
}
if let urlBar = urlBar {
urlBar.frame = CGRect(origin: .zero, size: CGSize(width: containerView.bounds.width - avoidingSize.width - urlBarPadding, height: containerView.bounds.height))
let origin = CGPoint(
x: leadingButtonsView.frame.maxX,
y: 0.0
)
urlBar.frame = CGRect(
origin: origin,
size: CGSize(
width: containerView.bounds.width - avoidingSize.width - origin.x,
height: containerView.bounds.height
)
)
}
}
}
@@ -128,6 +152,8 @@ class ToolbarViewController: UIViewController
let shareButton = UIButton(frame: .zero)
let darkModeButton = UIButton(frame: .zero)
let windowButton = UIButton(frame: .zero)
let backButton = UIButton(frame: .zero)
let forwardButton = UIButton(frame: .zero)
var darkModeEnabled: Bool = false {
didSet {
@@ -156,16 +182,21 @@ class ToolbarViewController: UIViewController
// Window button
windowButton.setImage(UIImage(systemName: "rectangle.on.rectangle"), for: .normal)
// Back button
backButton.setImage(UIImage(systemName: "chevron.left"), for: .normal)
// Forward button
forwardButton.setImage(UIImage(systemName: "chevron.right"), for: .normal)
let toolbarAnimationDuration: TimeInterval = 0.3
urlBar.textField.addAction(.init(handler: { [weak self] _ in
guard let self = self else { return }
urlBar.textField.addAction(.init(handler: { [toolbarView, urlBar] _ in
UIView.animate(withDuration: toolbarAnimationDuration) {
self.toolbarView.cancelButtonVisible = self.urlBar.textField.isFirstResponder
toolbarView.cancelButtonVisible = urlBar.textField.isFirstResponder
}
}), for: [ .editingDidBegin, .editingDidEnd ])
toolbarView.cancelButton.addAction(.init(handler: { [weak self] action in
self?.urlBar.textField.resignFirstResponder()
toolbarView.cancelButton.addAction(.init(handler: { [urlBar] action in
urlBar.textField.resignFirstResponder()
}), for: .touchUpInside)
traitCollectionDidChange(nil)
@@ -174,18 +205,22 @@ class ToolbarViewController: UIViewController
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
toolbarView.buttonsView.removeAllButtonViews()
toolbarView.leadingButtonsView.removeAllButtonViews()
toolbarView.trailingButtonsView.removeAllButtonViews()
// Setup toolbar based on trait collection
if traitCollection.horizontalSizeClass == .compact {
toolbarView.buttonsView.addButtonView(darkModeButton)
toolbarView.buttonsView.addButtonView(scriptControllerIconView)
toolbarView.buttonsView.addButtonView(windowButton)
toolbarView.trailingButtonsView.addButtonView(darkModeButton)
toolbarView.trailingButtonsView.addButtonView(scriptControllerIconView)
toolbarView.trailingButtonsView.addButtonView(windowButton)
} else {
toolbarView.buttonsView.addButtonView(darkModeButton)
toolbarView.buttonsView.addButtonView(shareButton)
toolbarView.buttonsView.addButtonView(scriptControllerIconView)
toolbarView.buttonsView.addButtonView(windowButton)
toolbarView.leadingButtonsView.addButtonView(backButton)
toolbarView.leadingButtonsView.addButtonView(forwardButton)
toolbarView.trailingButtonsView.addButtonView(darkModeButton)
toolbarView.trailingButtonsView.addButtonView(shareButton)
toolbarView.trailingButtonsView.addButtonView(scriptControllerIconView)
toolbarView.trailingButtonsView.addButtonView(windowButton)
}
}

View File

@@ -54,10 +54,8 @@ class URLBar: UIView
textField.clearButtonMode = .whileEditing
addSubview(textField)
textField.addAction(.init(handler: { [weak self] _ in
if let self = self {
self.refreshButton.isHidden = self.textField.isFirstResponder
}
textField.addAction(.init(handler: { [textField, refreshButton] _ in
refreshButton.isHidden = textField.isFirstResponder
}), for: [ .editingDidBegin, .editingDidEnd ])
refreshButton.tintColor = .secondaryLabel