Title bar

This commit is contained in:
James Magahern
2020-07-29 14:16:25 -07:00
parent 9f506c879f
commit f330293606
6 changed files with 101 additions and 1 deletions

View File

@@ -11,6 +11,8 @@ import WebKit
class BrowserView: UIView
{
let titlebarView = TitlebarView()
var toolbarView: ToolbarView? {
didSet { addSubview(toolbarView!) }
}
@@ -32,6 +34,8 @@ class BrowserView: UIView
convenience init() {
self.init(frame: .zero)
addSubview(titlebarView)
keyboardWillShowObserver = NotificationCenter.default.publisher(for: UIWindow.keyboardWillShowNotification).sink { notification in
if let keyboardFrame = notification.userInfo?[UIWindow.keyboardFrameEndUserInfoKey] as? CGRect {
self.keyboardLayoutOffset = self.bounds.height - keyboardFrame.minY
@@ -59,5 +63,21 @@ class BrowserView: UIView
toolbarView.bounds = CGRect(origin: .zero, size: toolbarSize)
toolbarView.center = CGPoint(x: bounds.center.x, y: bounds.maxY - (toolbarView.bounds.height / 2) - keyboardLayoutOffset)
}
bringSubviewToFront(titlebarView)
var titlebarHeight: CGFloat = 24.0
titlebarHeight += safeAreaInsets.top
titlebarView.frame = CGRect(origin: .zero, size: CGSize(width: bounds.width, height: titlebarHeight))
// Fix web view content insets
webView?.scrollView.automaticallyAdjustsScrollIndicatorInsets = false
var webViewContentInset = UIEdgeInsets()
webViewContentInset.top = titlebarView.frame.height
webViewContentInset.bottom = toolbarView?.frame.height ?? 0
webView?.scrollView.contentInset = webViewContentInset
webView?.scrollView.scrollIndicatorInsets = webViewContentInset
}
}

View File

@@ -19,8 +19,11 @@ class BrowserViewController: UIViewController,
private var blockedScriptOrigins = Set<String>()
override var canBecomeFirstResponder: Bool { true }
private var titleObservation: NSKeyValueObservation?
private var loadingObservation: NSKeyValueObservation?
override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent }
init() {
super.init(nibName: nil, bundle: nil)
}
@@ -64,6 +67,11 @@ class BrowserViewController: UIViewController,
self.toolbarController.urlBar.loadProgress = .loading(progress: webView.estimatedProgress)
}
// Title observer
titleObservation = webView.observe(\.title, changeHandler: { (webView, observedChange) in
self.browserView.titlebarView.titleLabelView.text = webView.title
})
self.view = browserView
}

View File

@@ -0,0 +1,60 @@
//
// TitlebarView.swift
// SBrowser
//
// Created by James Magahern on 7/29/20.
//
import UIKit
class TitlebarView: UIView
{
public let titleLabelView = UILabel(frame: .zero)
private let backgroundImageView = UIImageView(frame: .zero)
convenience init() {
self.init(frame: .zero)
addSubview(backgroundImageView)
addSubview(titleLabelView)
titleLabelView.textColor = .white
titleLabelView.layer.shadowColor = UIColor.black.cgColor
titleLabelView.layer.shadowRadius = 0.0
titleLabelView.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
titleLabelView.font = UIFont.boldSystemFont(ofSize: 12.0)
}
private func backgroundImageForSize(_ size: CGSize) -> UIImage? {
var image: UIImage? = nil
UIGraphicsBeginImageContext(CGSize(width: size.width, height: 1.0))
if let context = UIGraphicsGetCurrentContext() {
let gradientColorsArray = [
UIColor(red: 0.101, green: 0.176, blue: 0.415, alpha: 1.0).cgColor,
UIColor(red: 0.153, green: 0.000, blue: 0.153, alpha: 1.0).cgColor
]
if let gradient = CGGradient(colorsSpace: nil, colors: gradientColorsArray as CFArray, locations: nil) {
context.drawLinearGradient(gradient, start: .zero, end: CGPoint(x: size.width, y: 0.0), options: CGGradientDrawingOptions())
}
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext();
}
return image
}
override func layoutSubviews() {
super.layoutSubviews()
backgroundImageView.frame = bounds
titleLabelView.frame = bounds.avoiding(verticalInsets: safeAreaInsets).insetBy(dx: 8.0, dy: 0.0)
if let image = backgroundImageView.image, image.size == bounds.size {
// No op
} else {
backgroundImageView.image = backgroundImageForSize(bounds.size)
}
}
}

View File

@@ -46,7 +46,7 @@ class URLBar: UIView
textField.keyboardType = .webSearch
textField.autocorrectionType = .no
textField.autocapitalizationType = .none
textField.font = .preferredFont(forTextStyle: .body)
textField.font = .systemFont(ofSize: 14.0)
textField.clearingBehavior = .clearOnInsertionAndShowSelectionTint
addSubview(textField)