Load progress indicator

This commit is contained in:
James Magahern
2020-07-28 11:31:30 -07:00
parent 37eeeacc85
commit 5e80faac62
2 changed files with 68 additions and 4 deletions

View File

@@ -12,7 +12,17 @@ class URLBar: UIView
let textField = UITextField(frame: .zero)
let refreshButton = UIButton(frame: .zero)
public enum LoadProgress {
case complete
case loading(progress: Double)
}
public var loadProgress: LoadProgress = .complete {
didSet { updateProgressIndicator() }
}
private let backgroundView = UIVisualEffectView(effect: UIBlurEffect(style: .systemThickMaterial))
private let progressIndicatorView = ProgressIndicatorView()
convenience init() {
self.init(frame: .zero)
@@ -26,6 +36,8 @@ class URLBar: UIView
backgroundView.isUserInteractionEnabled = false
addSubview(backgroundView)
backgroundView.contentView.addSubview(progressIndicatorView)
textField.backgroundColor = .clear
textField.textContentType = .URL
textField.keyboardType = .webSearch
@@ -40,19 +52,60 @@ class URLBar: UIView
addSubview(refreshButton)
}
override var intrinsicContentSize: CGSize
{
private func updateProgressIndicator() {
UIView.animate(withDuration: 0.4) {
switch self.loadProgress {
case .complete:
self.progressIndicatorView.progress = 1.0
self.progressIndicatorView.alpha = 0.0
case .loading(let progress):
self.progressIndicatorView.progress = progress
self.progressIndicatorView.alpha = 1.0
}
} completion: { _ in
if case LoadProgress.complete = self.loadProgress {
// Reset back to zero
self.progressIndicatorView.progress = 0.0
}
}
}
override var intrinsicContentSize: CGSize {
let preferredHeight = CGFloat(34)
return CGSize(width: 1000.0, height: preferredHeight)
}
override func layoutSubviews()
{
override func layoutSubviews() {
super.layoutSubviews()
backgroundView.frame = bounds
progressIndicatorView.frame = backgroundView.contentView.bounds
textField.frame = bounds.insetBy(dx: 6.0, dy: 0)
let refreshButtonSize = CGSize(width: textField.frame.height, height: textField.frame.height)
refreshButton.frame = CGRect(origin: CGPoint(x: bounds.width - refreshButtonSize.width, y: 0), size: refreshButtonSize)
}
}
class ProgressIndicatorView: UIView
{
public var progress: Double = 0.0 {
didSet { layoutSubviews() }
}
private let progressFillView = UIView(frame: .zero)
convenience init() {
self.init(frame: .zero)
progressFillView.backgroundColor = .systemBlue
progressFillView.alpha = 0.3
addSubview(progressFillView)
}
override func layoutSubviews() {
super.layoutSubviews()
let width = CGFloat(progress) * bounds.width
progressFillView.frame = CGRect(origin: .zero, size: CGSize(width: width, height: bounds.height))
}
}