diff --git a/SBrowser/Browser View/BrowserView.swift b/SBrowser/Browser View/BrowserView.swift index 48666c3..8d01b74 100644 --- a/SBrowser/Browser View/BrowserView.swift +++ b/SBrowser/Browser View/BrowserView.swift @@ -93,8 +93,7 @@ class BrowserView: UIView webViewContentInset.bottom += toolbarView.frame.height } else { // Regular: toolbar is at the top - toolbarView.bounds = CGRect(origin: .zero, size: toolbarSize) - toolbarView.center = CGPoint(x: bounds.center.x, y: titlebarView.center.y + titlebarView.frame.height) + toolbarView.frame = CGRect(origin: CGPoint(x: 0.0, y: titlebarView.frame.maxY), size: toolbarSize) webViewContentInset.top += toolbarView.frame.height } } diff --git a/SBrowser/Browser View/BrowserViewController.swift b/SBrowser/Browser View/BrowserViewController.swift index b39344b..587e27b 100644 --- a/SBrowser/Browser View/BrowserViewController.swift +++ b/SBrowser/Browser View/BrowserViewController.swift @@ -9,7 +9,8 @@ import UIKit class BrowserViewController: UIViewController, SBRProcessBundleBridgeDelegate, WKNavigationDelegate, - UITextFieldDelegate, ScriptPolicyViewControllerDelegate + UITextFieldDelegate, ScriptPolicyViewControllerDelegate, + UIPopoverPresentationControllerDelegate { let bridge = SBRProcessBundleBridge() let browserView = BrowserView() @@ -37,6 +38,8 @@ class BrowserViewController: UIViewController, bridge.delegate = self bridge.policyDataSource = policyManager + addChild(toolbarController) + let webView = bridge.webView webView.allowsBackForwardNavigationGestures = true webView.navigationDelegate = self @@ -66,6 +69,7 @@ class BrowserViewController: UIViewController, let navController = UINavigationController(rootViewController: scriptViewController) navController.modalPresentationStyle = .popover navController.popoverPresentationController?.sourceView = self.toolbarController.scriptControllerIconView + navController.popoverPresentationController?.delegate = self self.present(navController, animated: true, completion: nil) }), for: .touchUpInside) @@ -114,6 +118,13 @@ class BrowserViewController: UIViewController, bridge.webView.load(request) } + // MARK: UIPopoverPresentationControllerDelegate + + func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { + // Forces popovers to present on iPhone + return .none + } + // MARK: SBRProcessBundleBridgeDelegate func webProcess(_ bridge: SBRProcessBundleBridge, didAllowScriptResourceFromOrigin origin: String) { diff --git a/SBrowser/Browser View/TitlebarView.swift b/SBrowser/Browser View/TitlebarView.swift index 50a5348..6db649d 100644 --- a/SBrowser/Browser View/TitlebarView.swift +++ b/SBrowser/Browser View/TitlebarView.swift @@ -49,7 +49,7 @@ class TitlebarView: UIView super.layoutSubviews() 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 { // No op diff --git a/SBrowser/Browser View/ToolbarViewController.swift b/SBrowser/Browser View/ToolbarViewController.swift index 720cadf..32b3b3e 100644 --- a/SBrowser/Browser View/ToolbarViewController.swift +++ b/SBrowser/Browser View/ToolbarViewController.swift @@ -18,6 +18,12 @@ class ToolbarButtonView: UIView setNeedsLayout() } + func removeAllButtonViews() { + buttonViews.forEach { $0.removeFromSuperview() } + buttonViews.removeAll() + setNeedsLayout() + } + override func sizeThatFits(_ size: CGSize) -> CGSize { let width: CGFloat = buttonViews.reduce(0.0) { (result, button) -> CGFloat in return result + button.sizeThatFits(size).width + buttonPadding @@ -61,6 +67,12 @@ class ToolbarView: UIView cancelButton.setTitle("Cancel", for: .normal) 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 @@ -115,6 +127,7 @@ class ToolbarViewController: UIViewController let scriptControllerIconView = ScriptControllerIconView() let shareButton = UIButton(frame: .zero) let darkModeButton = UIButton(frame: .zero) + let windowButton = UIButton(frame: .zero) var darkModeEnabled: Bool = false { didSet { @@ -134,12 +147,14 @@ class ToolbarViewController: UIViewController toolbarView.urlBar = urlBar + // Dark mode button darkModeButton.setImage(darkModeDisabledImage, for: .normal) - toolbarView.buttonsView.addButtonView(darkModeButton) + // Share button 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 urlBar.textField.addAction(.init(handler: { _ in @@ -151,6 +166,26 @@ class ToolbarViewController: UIViewController toolbarView.cancelButton.addAction(.init(handler: { action in self.urlBar.textField.resignFirstResponder() }), 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() {