Files
Attractor/App/Common UI/SegmentedReliefButton.swift

104 lines
3.6 KiB
Swift
Raw Normal View History

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() }
}
2021-04-19 17:55:24 -07:00
override var isPointerInteractionEnabled: Bool {
set { children.forEach { $0.isPointerInteractionEnabled = newValue } }
get { children.first?.isPointerInteractionEnabled ?? false }
}
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
backgroundsContainerView.clipsToBounds = true
backgroundsContainerView.layer.cornerRadius = Self.cornerRadius - Self.borderWidth
constrainedToSquare = false
addSubview(backgroundsContainerView)
2020-08-14 15:55:08 -07:00
}
override var isHighlighted: Bool {
2021-04-19 17:55:24 -07:00
// Does not highlight. Only children do.
set {} get { false }
2020-08-14 15:55:08 -07:00
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
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
}
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()
backgroundView.colors = [ .clear ]
2020-08-14 15:55:08 -07:00
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))
for (i, child) in children.enumerated() {
2020-08-14 15:55:08 -07:00
child.shadowView.isHidden = true
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
// 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
}
}
}