Goofing around with Box

This commit is contained in:
James Magahern
2021-07-13 18:11:47 -07:00
parent 560b1a4a75
commit 777b079f5e
5 changed files with 133 additions and 48 deletions

View File

@@ -14,6 +14,13 @@ class DocumentControlItemView: UIControl
let imageView = UIImageView(frame: .zero)
let label = UILabel(frame: .zero)
enum ViewType: String {
case imageView
case label
case separator
case highlightView
}
var drawsBottomSeparator: Bool = false {
didSet { setNeedsLayout() }
}
@@ -50,38 +57,68 @@ class DocumentControlItemView: UIControl
CGSize(width: size.width, height: Self.controlHeight)
}
private func box(_ bounds: CGRect) -> Box<ViewType> {
Box {
let padding: CGFloat = 18.0
let imageSize: CGFloat = 24.0
let ibounds = bounds.inset(by: layoutMargins)
let imageRect = CGRect(
x: ibounds.minX + 6.0, y: 0.0,
width: imageSize, height: imageSize
).centeredY(inRect: bounds)
(ViewType.imageView, imageRect)
(ViewType.highlightView, bounds)
(ViewType.label, CGRect(
x: imageRect.maxX + padding, y: ibounds.minY,
width: ibounds.width - imageRect.maxX - padding, height: ibounds.height
))
let separatorHeight: CGFloat = 1.0
if drawsBottomSeparator {
(ViewType.separator, CGRect(
x: bounds.minX, y: bounds.height - separatorHeight,
width: bounds.width, height: separatorHeight
))
} else {
(ViewType.separator, CGRect.zero)
}
}
}
override func layoutSubviews() {
super.layoutSubviews()
highlightView.frame = bounds
box(bounds).fill([
.imageView : imageView,
.separator : separatorView,
.label : label,
.highlightView : highlightView
])
let padding: CGFloat = 18.0
let imageSize: CGFloat = 24.0
let bounds = self.bounds.inset(by: layoutMargins)
imageView.frame = CGRect(
x: bounds.minX + 6.0, y: 0.0,
width: imageSize, height: imageSize
).centeredY(inRect: self.bounds)
label.frame = CGRect(
x: imageView.frame.maxX + padding, y: bounds.minY,
width: bounds.width - imageView.frame.maxX - padding, height: bounds.height
)
let separatorHeight: CGFloat = 1.0
if drawsBottomSeparator {
separatorView.isHidden = false
separatorView.frame = CGRect(
x: self.bounds.minX, y: self.bounds.height - separatorHeight,
width: self.bounds.width, height: separatorHeight
)
} else {
separatorView.isHidden = true
}
separatorView.isHidden = !drawsBottomSeparator
}
override func setTracking(_ tracking: Bool) {
super.setTracking(tracking)
highlightView.isHidden = !tracking
}
public func title(_ title: String) -> Self {
self.label.text = title
return self
}
public func image(_ image: UIImage?) -> Self {
self.imageView.image = image
return self
}
public func symbol(_ name: String) -> Self {
return self.image(UIImage(systemName: name))
}
}

View File

@@ -10,37 +10,25 @@ import UIKit
class DocumentControlViewController: UIViewController
{
let documentControlsView = DocumentControlsView()
let fontSizeAdjustView = FontSizeAdjustView()
let findOnPageControlView = DocumentControlItemView()
let navigationControlView = NavigationControlsView()
let settingsView = DocumentControlItemView()
let readabilityView = DocumentControlItemView()
let darkModeView = DocumentControlItemView()
let archiveView = DocumentControlItemView()
let emailView = DocumentControlItemView()
let fontSizeAdjustView = FontSizeAdjustView()
let navigationControlView = NavigationControlsView()
let findOnPageControlView = DocumentControlItemView().title("Find On Page") .symbol("magnifyingglass")
let settingsView = DocumentControlItemView().title("Settings") .symbol("gear")
let readabilityView = DocumentControlItemView().title("Reader Mode") .symbol("doc.richtext")
let archiveView = DocumentControlItemView().title("Archive.today") .symbol("shippingbox")
let emailView = DocumentControlItemView().title("Email") .symbol("envelope")
let sharingView = DocumentControlItemView().title("Share") .symbol("square.and.arrow.up")
let darkModeView = DocumentControlItemView().title("Dark Mode")
var observations: [NSKeyValueObservation] = []
static public let preferredWidth = CGFloat(200.0)
static public let preferredWidth = CGFloat(230.0)
init(darkModeEnabled: Bool) {
super.init(nibName: nil, bundle: nil)
findOnPageControlView.label.text = "Find On Page"
findOnPageControlView.imageView.image = UIImage(systemName: "magnifyingglass")
settingsView.label.text = "Settings"
settingsView.imageView.image = UIImage(systemName: "gear")
readabilityView.label.text = "Reader Mode"
readabilityView.imageView.image = UIImage(systemName: "doc.richtext")
archiveView.label.text = "Archive.today"
archiveView.imageView.image = UIImage(systemName: "shippingbox")
emailView.label.text = "Email"
emailView.imageView.image = UIImage(systemName: "envelope")
if darkModeEnabled {
darkModeView.label.text = "Disable Dark Mode"
} else {
@@ -53,6 +41,7 @@ class DocumentControlViewController: UIViewController
documentControlsView.stackView.addArrangedSubview(fontSizeAdjustView)
documentControlsView.stackView.addArrangedSubview(emailView)
documentControlsView.stackView.addArrangedSubview(sharingView)
documentControlsView.stackView.addArrangedSubview(findOnPageControlView)
documentControlsView.stackView.addArrangedSubview(darkModeView)
documentControlsView.stackView.addArrangedSubview(readabilityView)