2020-08-14 15:55:08 -07:00
|
|
|
//
|
|
|
|
|
// SegmentedReliefButton.swift
|
|
|
|
|
// App
|
|
|
|
|
//
|
|
|
|
|
// Created by James Magahern on 8/14/20.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
import UIKit
|
|
|
|
|
|
|
|
|
|
class SegmentedReliefButton: ReliefButton
|
|
|
|
|
{
|
|
|
|
|
var children: [ReliefButton] = [] {
|
|
|
|
|
willSet { children.forEach { $0.removeFromSuperview() } }
|
|
|
|
|
didSet { children.forEach { addSubview($0) }; setNeedsLayout() }
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-14 18:42:40 -07:00
|
|
|
private let backgroundMaskView = UIView(frame: .zero)
|
|
|
|
|
private let backgroundsContainerView = UIView(frame: .zero)
|
|
|
|
|
private var childrenHighlighObservations: [NSKeyValueObservation] = []
|
|
|
|
|
|
2020-08-14 15:55:08 -07:00
|
|
|
init(children: [ReliefButton]) {
|
|
|
|
|
super.init()
|
|
|
|
|
self.children = children
|
2020-08-14 18:42:40 -07:00
|
|
|
|
|
|
|
|
backgroundMaskView.backgroundColor = .black
|
|
|
|
|
backgroundMaskView.layer.masksToBounds = true
|
|
|
|
|
backgroundMaskView.layer.cornerRadius = Self.cornerRadius - Self.borderWidth
|
|
|
|
|
|
|
|
|
|
backgroundsContainerView.clipsToBounds = true
|
|
|
|
|
backgroundsContainerView.mask = backgroundMaskView
|
|
|
|
|
|
|
|
|
|
addSubview(backgroundsContainerView)
|
2020-08-14 15:55:08 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override var isHighlighted: Bool {
|
|
|
|
|
didSet {}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
required init?(coder: NSCoder) {
|
|
|
|
|
fatalError("init(coder:) has not been implemented")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override func sizeThatFits(_ size: CGSize) -> CGSize {
|
2020-08-14 18:42:40 -07:00
|
|
|
let ourSize = super.sizeThatFits(size)
|
2020-08-14 15:55:08 -07:00
|
|
|
let width: CGFloat = children.reduce(0.0) { (result, button) -> CGFloat in
|
|
|
|
|
return result + button.sizeThatFits(size).width
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-14 18:42:40 -07:00
|
|
|
return CGSize(width: width, height: ourSize.height)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override func setBackgroundInverted(_ inverted: Bool) {
|
|
|
|
|
// no-op
|
2020-08-14 15:55:08 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override func layoutSubviews() {
|
|
|
|
|
super.layoutSubviews()
|
|
|
|
|
|
2020-08-14 18:42:40 -07:00
|
|
|
backgroundView.colors = [ .clear ]
|
2020-08-14 15:55:08 -07:00
|
|
|
backgroundView.frame = bounds
|
|
|
|
|
shadowView.frame = bounds
|
|
|
|
|
|
2020-08-14 18:42:40 -07:00
|
|
|
backgroundMaskView.frame = backgroundView.frame.insetBy(dx: 1.0, dy: 1.0)
|
|
|
|
|
backgroundsContainerView.frame = backgroundView.frame
|
|
|
|
|
|
|
|
|
|
childrenHighlighObservations.removeAll()
|
|
|
|
|
backgroundsContainerView.subviews.forEach { $0.removeFromSuperview() }
|
|
|
|
|
|
|
|
|
|
let darkMode = self.traitCollection.userInterfaceStyle == .dark
|
2020-08-14 15:55:08 -07:00
|
|
|
var buttonRect = CGRect(origin: .zero, size: CGSize(width: 0, height: bounds.height))
|
2020-08-14 18:42:40 -07:00
|
|
|
for (i, child) in children.enumerated() {
|
2020-08-14 15:55:08 -07:00
|
|
|
child.shadowView.isHidden = true
|
2020-08-14 18:42:40 -07:00
|
|
|
child.backgroundView.isHidden = true
|
2020-08-14 15:55:08 -07:00
|
|
|
bringSubviewToFront(child)
|
|
|
|
|
|
|
|
|
|
let childSize = child.sizeThatFits(bounds.size)
|
|
|
|
|
buttonRect.size = CGSize(width: childSize.width, height: bounds.height)
|
|
|
|
|
child.frame = buttonRect
|
|
|
|
|
|
|
|
|
|
buttonRect.origin.x += buttonRect.width
|
2020-08-14 18:42:40 -07:00
|
|
|
|
|
|
|
|
// Background
|
|
|
|
|
let backgroundView = GradientView(direction: .vertical, colors: Self.gradientColors(inverted: false, darkMode: darkMode))
|
|
|
|
|
backgroundView.frame = child.frame
|
|
|
|
|
backgroundsContainerView.insertSubview(backgroundView, at: 0)
|
|
|
|
|
childrenHighlighObservations.append(child.observe(\.isHighlighted) { [backgroundView] (button, changeEvent) in
|
|
|
|
|
backgroundView.colors = Self.gradientColors(inverted: button.isHighlighted, darkMode: darkMode)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// Separator
|
|
|
|
|
if i < children.count - 1 {
|
|
|
|
|
let separatorView = UIView(frame: CGRect(
|
|
|
|
|
x: child.frame.maxX,
|
|
|
|
|
y: 0,
|
|
|
|
|
width: 1.0,
|
|
|
|
|
height: bounds.height
|
|
|
|
|
))
|
|
|
|
|
separatorView.backgroundColor = .systemFill
|
|
|
|
|
backgroundsContainerView.addSubview(separatorView)
|
|
|
|
|
}
|
2020-08-14 15:55:08 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|