I attempted to reproduce the bug in UIKit, but it works correctly there. Notice how the Tab Bar and the accessory view change color simultaneously.
final class ViewController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
let firstVC = FirstTabVC()
firstVC.tabBarItem = UITabBarItem(
title: "first",
image: UIImage(systemName: "1.circle"),
tag: 0
)
let secondVC = SecondTabVC()
secondVC.tabBarItem = UITabBarItem(
title: "second",
image: UIImage(systemName: "2.circle"),
tag: 1
)
viewControllers = [firstVC, secondVC]
setupBottomAccessory()
}
func setupBottomAccessory() {
let titleLabel = UILabel()
titleLabel.text = "Title"
let iconView = UIImageView(image: UIImage(systemName: "play.fill"))
iconView.preferredSymbolConfiguration = .init(pointSize: 20, weight: .semibold)
iconView.tintColor = .label
iconView.contentMode = .scaleAspectFit
let stackView = UIStackView(arrangedSubviews: [titleLabel, iconView])
stackView.translatesAutoresizingMaskIntoConstraints = false
let accessoryView = UIView()
accessoryView.addSubview(stackView)
NSLayoutConstraint.activate([
accessoryView.heightAnchor.constraint(equalToConstant: 48),
stackView.topAnchor.constraint(equalTo: accessoryView.topAnchor),
stackView.leadingAnchor.constraint(equalTo: accessoryView.leadingAnchor, constant: 16),
stackView.trailingAnchor.constraint(equalTo: accessoryView.trailingAnchor, constant: -16),
stackView.bottomAnchor.constraint(equalTo: accessoryView.bottomAnchor),
])
bottomAccessory = UITabAccessory(contentView: accessoryView)
}
}
private final class FirstTabVC: UIViewController {
private let scrollView = UIScrollView()
private let contentView = UIView()
private let topSpacer = UIView()
private let gradientView = GradientView()
override func viewDidLoad() {
super.viewDidLoad()
scrollView.translatesAutoresizingMaskIntoConstraints = false
contentView.translatesAutoresizingMaskIntoConstraints = false
topSpacer.translatesAutoresizingMaskIntoConstraints = false
gradientView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(scrollView)
scrollView.addSubview(contentView)
contentView.addSubview(topSpacer)
contentView.addSubview(gradientView)
NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
contentView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor),
contentView.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor),
contentView.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor),
contentView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor),
contentView.widthAnchor.constraint(equalTo: scrollView.frameLayoutGuide.widthAnchor),
topSpacer.topAnchor.constraint(equalTo: contentView.topAnchor),
topSpacer.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
topSpacer.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
topSpacer.heightAnchor.constraint(equalToConstant: 800),
gradientView.topAnchor.constraint(equalTo: topSpacer.bottomAnchor),
gradientView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
gradientView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
gradientView.heightAnchor.constraint(equalToConstant: 800),
gradientView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor)
])
}
}
private final class SecondTabVC: UIViewController { }
private final class GradientView: UIView {
override class var layerClass: AnyClass { CAGradientLayer.self }
override init(frame: CGRect) {
super.init(frame: frame)
let layer = layer as! CAGradientLayer
layer.colors = [UIColor.systemYellow.cgColor, UIColor.black.cgColor]
layer.startPoint = CGPoint(x: 0.5, y: 0.0)
layer.endPoint = CGPoint(x: 0.5, y: 1.0)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}