185 lines
5.2 KiB
Swift
185 lines
5.2 KiB
Swift
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
import UIKit
|
|
import SnapKit
|
|
|
|
private struct Constants {
|
|
static let ImageAndTextContainerYOffset = 2.0
|
|
static let ImageAndTextOffset = 3.0
|
|
|
|
static let BadgeTopOffset = -5.0
|
|
static let BadgeHorizontalOffset = 5.0
|
|
static let BadgeMinimumWidth = 22.0
|
|
static let BadgeHeight: CGFloat = 18.0
|
|
}
|
|
|
|
class TabBarBadgeItem: TabBarAbstractItem {
|
|
override var selected: Bool {
|
|
didSet {
|
|
let color = theme.colorForType(selected ? .TabItemActive : .TabItemInactive)
|
|
|
|
textLabel.textColor = color
|
|
imageView.tintColor = color
|
|
}
|
|
}
|
|
|
|
var image: UIImage? {
|
|
didSet {
|
|
imageView.image = image?.withRenderingMode(.alwaysTemplate)
|
|
}
|
|
}
|
|
var text: String? {
|
|
didSet {
|
|
textLabel.text = text
|
|
}
|
|
}
|
|
|
|
var badgeText: String? {
|
|
didSet {
|
|
badgeTextWasUpdated()
|
|
}
|
|
}
|
|
|
|
/// If there is any badge text, accessibilityValue will be set to <badgeText + badgeAccessibilityEnding>
|
|
var badgeAccessibilityEnding: String?
|
|
|
|
fileprivate let theme: Theme
|
|
|
|
fileprivate var imageAndTextContainer: UIView!
|
|
fileprivate var imageView: UIImageView!
|
|
fileprivate var textLabel: UILabel!
|
|
|
|
fileprivate var badgeContainer: UIView!
|
|
fileprivate var badgeLabel: UILabel!
|
|
|
|
fileprivate var button: UIButton!
|
|
|
|
init(theme: Theme) {
|
|
self.theme = theme
|
|
|
|
super.init(frame: CGRect.zero)
|
|
|
|
backgroundColor = .clear
|
|
|
|
createViews()
|
|
installConstraints()
|
|
|
|
badgeTextWasUpdated()
|
|
}
|
|
|
|
required convenience init?(coder aDecoder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
}
|
|
|
|
// Accessibility
|
|
extension TabBarBadgeItem {
|
|
override var accessibilityLabel: String? {
|
|
get {
|
|
return text
|
|
}
|
|
set {}
|
|
}
|
|
|
|
override var accessibilityValue: String? {
|
|
get {
|
|
guard var result = badgeText else {
|
|
return nil
|
|
}
|
|
|
|
if let ending = badgeAccessibilityEnding {
|
|
result += " " + ending
|
|
}
|
|
|
|
return result
|
|
}
|
|
set {}
|
|
}
|
|
}
|
|
|
|
// Actions
|
|
extension TabBarBadgeItem {
|
|
@objc func buttonPressed() {
|
|
didTapHandler?()
|
|
}
|
|
}
|
|
|
|
private extension TabBarBadgeItem {
|
|
func createViews() {
|
|
imageAndTextContainer = UIView()
|
|
imageAndTextContainer.backgroundColor = .clear
|
|
addSubview(imageAndTextContainer)
|
|
|
|
imageView = UIImageView()
|
|
imageView.backgroundColor = .clear
|
|
imageAndTextContainer.addSubview(imageView)
|
|
|
|
textLabel = UILabel()
|
|
textLabel.textColor = theme.colorForType(.NormalText)
|
|
textLabel.textAlignment = .center
|
|
textLabel.backgroundColor = .clear
|
|
textLabel.font = UIFont.systemFont(ofSize: 10.0)
|
|
imageAndTextContainer.addSubview(textLabel)
|
|
|
|
badgeContainer = UIView()
|
|
badgeContainer.backgroundColor = theme.colorForType(.TabBadgeBackground)
|
|
badgeContainer.layer.masksToBounds = true
|
|
badgeContainer.layer.cornerRadius = Constants.BadgeHeight / 2
|
|
addSubview(badgeContainer)
|
|
|
|
badgeLabel = UILabel()
|
|
badgeLabel.textColor = theme.colorForType(.TabBadgeText)
|
|
badgeLabel.textAlignment = .center
|
|
badgeLabel.backgroundColor = .clear
|
|
badgeLabel.font = UIFont.antidoteFontWithSize(14.0, weight: .light)
|
|
badgeContainer.addSubview(badgeLabel)
|
|
|
|
button = UIButton()
|
|
button.backgroundColor = .clear
|
|
button.addTarget(self, action: #selector(TabBarBadgeItem.buttonPressed), for: .touchUpInside)
|
|
addSubview(button)
|
|
}
|
|
|
|
func installConstraints() {
|
|
imageAndTextContainer.snp.makeConstraints {
|
|
$0.centerX.equalTo(self)
|
|
$0.centerY.equalTo(self).offset(Constants.ImageAndTextContainerYOffset)
|
|
}
|
|
|
|
imageView.snp.makeConstraints {
|
|
$0.top.equalTo(imageAndTextContainer)
|
|
$0.centerX.equalTo(imageAndTextContainer)
|
|
}
|
|
|
|
textLabel.snp.makeConstraints {
|
|
$0.top.equalTo(imageView.snp.bottom).offset(Constants.ImageAndTextOffset)
|
|
$0.centerX.equalTo(imageAndTextContainer)
|
|
$0.bottom.equalTo(imageAndTextContainer)
|
|
}
|
|
|
|
badgeContainer.snp.makeConstraints {
|
|
$0.leading.equalTo(imageAndTextContainer.snp.leading)
|
|
$0.top.equalTo(imageAndTextContainer.snp.top).offset(Constants.BadgeTopOffset)
|
|
$0.width.greaterThanOrEqualTo(Constants.BadgeMinimumWidth)
|
|
$0.height.equalTo(Constants.BadgeHeight)
|
|
}
|
|
|
|
badgeLabel.snp.makeConstraints {
|
|
$0.leading.equalTo(badgeContainer).offset(Constants.BadgeHorizontalOffset)
|
|
$0.trailing.equalTo(badgeContainer).offset(-Constants.BadgeHorizontalOffset)
|
|
$0.centerY.equalTo(badgeContainer)
|
|
}
|
|
|
|
button.snp.makeConstraints {
|
|
$0.edges.equalTo(self)
|
|
}
|
|
}
|
|
|
|
func badgeTextWasUpdated() {
|
|
badgeLabel.text = badgeText
|
|
badgeContainer.isHidden = (badgeText == nil) || badgeText!.isEmpty
|
|
}
|
|
}
|