Visual tweaks
This commit is contained in:
@@ -93,8 +93,7 @@ class BrowserView: UIView
|
|||||||
webViewContentInset.bottom += toolbarView.frame.height
|
webViewContentInset.bottom += toolbarView.frame.height
|
||||||
} else {
|
} else {
|
||||||
// Regular: toolbar is at the top
|
// Regular: toolbar is at the top
|
||||||
toolbarView.bounds = CGRect(origin: .zero, size: toolbarSize)
|
toolbarView.frame = CGRect(origin: CGPoint(x: 0.0, y: titlebarView.frame.maxY), size: toolbarSize)
|
||||||
toolbarView.center = CGPoint(x: bounds.center.x, y: titlebarView.center.y + titlebarView.frame.height)
|
|
||||||
webViewContentInset.top += toolbarView.frame.height
|
webViewContentInset.top += toolbarView.frame.height
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,8 @@ import UIKit
|
|||||||
|
|
||||||
class BrowserViewController: UIViewController,
|
class BrowserViewController: UIViewController,
|
||||||
SBRProcessBundleBridgeDelegate, WKNavigationDelegate,
|
SBRProcessBundleBridgeDelegate, WKNavigationDelegate,
|
||||||
UITextFieldDelegate, ScriptPolicyViewControllerDelegate
|
UITextFieldDelegate, ScriptPolicyViewControllerDelegate,
|
||||||
|
UIPopoverPresentationControllerDelegate
|
||||||
{
|
{
|
||||||
let bridge = SBRProcessBundleBridge()
|
let bridge = SBRProcessBundleBridge()
|
||||||
let browserView = BrowserView()
|
let browserView = BrowserView()
|
||||||
@@ -37,6 +38,8 @@ class BrowserViewController: UIViewController,
|
|||||||
bridge.delegate = self
|
bridge.delegate = self
|
||||||
bridge.policyDataSource = policyManager
|
bridge.policyDataSource = policyManager
|
||||||
|
|
||||||
|
addChild(toolbarController)
|
||||||
|
|
||||||
let webView = bridge.webView
|
let webView = bridge.webView
|
||||||
webView.allowsBackForwardNavigationGestures = true
|
webView.allowsBackForwardNavigationGestures = true
|
||||||
webView.navigationDelegate = self
|
webView.navigationDelegate = self
|
||||||
@@ -66,6 +69,7 @@ class BrowserViewController: UIViewController,
|
|||||||
let navController = UINavigationController(rootViewController: scriptViewController)
|
let navController = UINavigationController(rootViewController: scriptViewController)
|
||||||
navController.modalPresentationStyle = .popover
|
navController.modalPresentationStyle = .popover
|
||||||
navController.popoverPresentationController?.sourceView = self.toolbarController.scriptControllerIconView
|
navController.popoverPresentationController?.sourceView = self.toolbarController.scriptControllerIconView
|
||||||
|
navController.popoverPresentationController?.delegate = self
|
||||||
|
|
||||||
self.present(navController, animated: true, completion: nil)
|
self.present(navController, animated: true, completion: nil)
|
||||||
}), for: .touchUpInside)
|
}), for: .touchUpInside)
|
||||||
@@ -114,6 +118,13 @@ class BrowserViewController: UIViewController,
|
|||||||
bridge.webView.load(request)
|
bridge.webView.load(request)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: UIPopoverPresentationControllerDelegate
|
||||||
|
|
||||||
|
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
|
||||||
|
// Forces popovers to present on iPhone
|
||||||
|
return .none
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: SBRProcessBundleBridgeDelegate
|
// MARK: SBRProcessBundleBridgeDelegate
|
||||||
|
|
||||||
func webProcess(_ bridge: SBRProcessBundleBridge, didAllowScriptResourceFromOrigin origin: String) {
|
func webProcess(_ bridge: SBRProcessBundleBridge, didAllowScriptResourceFromOrigin origin: String) {
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class TitlebarView: UIView
|
|||||||
super.layoutSubviews()
|
super.layoutSubviews()
|
||||||
|
|
||||||
backgroundImageView.frame = bounds
|
backgroundImageView.frame = bounds
|
||||||
titleLabelView.frame = bounds.avoiding(verticalInsets: safeAreaInsets).insetBy(dx: 8.0, dy: 0.0)
|
titleLabelView.frame = bounds.avoiding(verticalInsets: safeAreaInsets).insetBy(dx: 8.0 + layoutMargins.left, dy: 0.0)
|
||||||
|
|
||||||
if let image = backgroundImageView.image, image.size == bounds.size {
|
if let image = backgroundImageView.image, image.size == bounds.size {
|
||||||
// No op
|
// No op
|
||||||
|
|||||||
@@ -18,6 +18,12 @@ class ToolbarButtonView: UIView
|
|||||||
setNeedsLayout()
|
setNeedsLayout()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func removeAllButtonViews() {
|
||||||
|
buttonViews.forEach { $0.removeFromSuperview() }
|
||||||
|
buttonViews.removeAll()
|
||||||
|
setNeedsLayout()
|
||||||
|
}
|
||||||
|
|
||||||
override func sizeThatFits(_ size: CGSize) -> CGSize {
|
override func sizeThatFits(_ size: CGSize) -> CGSize {
|
||||||
let width: CGFloat = buttonViews.reduce(0.0) { (result, button) -> CGFloat in
|
let width: CGFloat = buttonViews.reduce(0.0) { (result, button) -> CGFloat in
|
||||||
return result + button.sizeThatFits(size).width + buttonPadding
|
return result + button.sizeThatFits(size).width + buttonPadding
|
||||||
@@ -61,6 +67,12 @@ class ToolbarView: UIView
|
|||||||
|
|
||||||
cancelButton.setTitle("Cancel", for: .normal)
|
cancelButton.setTitle("Cancel", for: .normal)
|
||||||
containerView.addSubview(cancelButton)
|
containerView.addSubview(cancelButton)
|
||||||
|
|
||||||
|
layer.masksToBounds = false
|
||||||
|
layer.shadowColor = UIColor.black.cgColor
|
||||||
|
layer.shadowOpacity = 0.2
|
||||||
|
layer.shadowOffset = CGSize(width: 0.0, height: 1.0)
|
||||||
|
layer.shadowRadius = 1.5
|
||||||
}
|
}
|
||||||
|
|
||||||
override func sizeThatFits(_ size: CGSize) -> CGSize
|
override func sizeThatFits(_ size: CGSize) -> CGSize
|
||||||
@@ -115,6 +127,7 @@ class ToolbarViewController: UIViewController
|
|||||||
let scriptControllerIconView = ScriptControllerIconView()
|
let scriptControllerIconView = ScriptControllerIconView()
|
||||||
let shareButton = UIButton(frame: .zero)
|
let shareButton = UIButton(frame: .zero)
|
||||||
let darkModeButton = UIButton(frame: .zero)
|
let darkModeButton = UIButton(frame: .zero)
|
||||||
|
let windowButton = UIButton(frame: .zero)
|
||||||
|
|
||||||
var darkModeEnabled: Bool = false {
|
var darkModeEnabled: Bool = false {
|
||||||
didSet {
|
didSet {
|
||||||
@@ -134,12 +147,14 @@ class ToolbarViewController: UIViewController
|
|||||||
|
|
||||||
toolbarView.urlBar = urlBar
|
toolbarView.urlBar = urlBar
|
||||||
|
|
||||||
|
// Dark mode button
|
||||||
darkModeButton.setImage(darkModeDisabledImage, for: .normal)
|
darkModeButton.setImage(darkModeDisabledImage, for: .normal)
|
||||||
toolbarView.buttonsView.addButtonView(darkModeButton)
|
|
||||||
|
|
||||||
|
// Share button
|
||||||
shareButton.setImage(UIImage(systemName: "square.and.arrow.up"), for: .normal)
|
shareButton.setImage(UIImage(systemName: "square.and.arrow.up"), for: .normal)
|
||||||
toolbarView.buttonsView.addButtonView(shareButton)
|
|
||||||
toolbarView.buttonsView.addButtonView(scriptControllerIconView)
|
// Window button
|
||||||
|
windowButton.setImage(UIImage(systemName: "rectangle.on.rectangle"), for: .normal)
|
||||||
|
|
||||||
let toolbarAnimationDuration: TimeInterval = 0.3
|
let toolbarAnimationDuration: TimeInterval = 0.3
|
||||||
urlBar.textField.addAction(.init(handler: { _ in
|
urlBar.textField.addAction(.init(handler: { _ in
|
||||||
@@ -151,6 +166,26 @@ class ToolbarViewController: UIViewController
|
|||||||
toolbarView.cancelButton.addAction(.init(handler: { action in
|
toolbarView.cancelButton.addAction(.init(handler: { action in
|
||||||
self.urlBar.textField.resignFirstResponder()
|
self.urlBar.textField.resignFirstResponder()
|
||||||
}), for: .touchUpInside)
|
}), for: .touchUpInside)
|
||||||
|
|
||||||
|
traitCollectionDidChange(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
|
||||||
|
super.traitCollectionDidChange(previousTraitCollection)
|
||||||
|
|
||||||
|
toolbarView.buttonsView.removeAllButtonViews()
|
||||||
|
|
||||||
|
// Setup toolbar based on trait collection
|
||||||
|
if traitCollection.horizontalSizeClass == .compact {
|
||||||
|
toolbarView.buttonsView.addButtonView(darkModeButton)
|
||||||
|
toolbarView.buttonsView.addButtonView(scriptControllerIconView)
|
||||||
|
toolbarView.buttonsView.addButtonView(windowButton)
|
||||||
|
} else {
|
||||||
|
toolbarView.buttonsView.addButtonView(darkModeButton)
|
||||||
|
toolbarView.buttonsView.addButtonView(shareButton)
|
||||||
|
toolbarView.buttonsView.addButtonView(scriptControllerIconView)
|
||||||
|
toolbarView.buttonsView.addButtonView(windowButton)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func loadView() {
|
override func loadView() {
|
||||||
|
|||||||
Reference in New Issue
Block a user