Код: Выделить всё
let itemText = UIBarButtonItem(title: "Text")
itemText.tintColor = .systemGreen
Проблема возникает, когда мне нужно создать UIBarButtonItem с пользовательским представлением. Я экспериментировал с UIButton, UISegmentedControl и UISwitch. Если я создаю и окрашиваю такие элементы управления и добавляю их в представление контроллера представления, цвета будут работать так, как ожидалось. Когда элементы управления того же цвета используются с UIBarButtonItem(customView:) и добавляются на панель навигации или панель инструментов, все цвета теряются (как ни странно, за исключением UISwitch onTintColor).
Я упускаю правильный способ тонирования пользовательских представлений, используемых таким образом, или это проблема iOS 26?
Вот пример кода для демонстрации проблема. Создайте новый проект раскадровки приложения iOS в Xcode 26. Настройте раскадровку для отображения контроллера навигации с контроллером простого представления в качестве его корня. Замените код ViewController следующим:
Код: Выделить всё
import UIKit
class ViewController: UIViewController {
func createButton() -> UIButton {
var cfg = UIButton.Configuration.plain()
cfg.image = UIImage(systemName: "eye")
let button = UIButton(configuration: cfg)
return button
}
func createSegment() -> UISegmentedControl {
let i1 = UIImage(systemName: "eye")!
let i2 = UIImage(systemName: "eye")!
let seg = UISegmentedControl(items: [i1, i2])
seg.selectedSegmentIndex = 0
return seg
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
let b1 = createButton()
b1.tintColor = .systemRed
b1.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(b1)
let s1 = createSegment()
s1.selectedSegmentTintColor = .systemYellow
s1.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(s1)
let w1 = UISwitch()
w1.onTintColor = .systemCyan
w1.thumbTintColor = .systemPink
w1.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(w1)
NSLayoutConstraint.activate([
b1.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor),
b1.centerYAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerYAnchor),
s1.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor),
s1.topAnchor.constraint(equalTo: b1.bottomAnchor, constant: 20),
w1.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor),
w1.topAnchor.constraint(equalTo: s1.bottomAnchor, constant: 20),
])
// Despite all these attempts to set a color, the views in the navbar remain black
let b2 = createButton()
b2.tintColor = .systemRed // Nope
let nb1 = UIBarButtonItem(customView: b2)
nb1.tintColor = .systemYellow // Nope
let s2 = createSegment()
s2.selectedSegmentTintColor = .systemRed // Nope
let nb2 = UIBarButtonItem(customView: s2)
nb2.tintColor = .systemMint // Nope
let w2 = UISwitch()
w2.onTintColor = .systemCyan // This actually works
w2.thumbTintColor = .systemPink // But this doesn't
let nb3 = UIBarButtonItem(customView: w2)
nb3.tintColor = .systemBrown // Neither does this
let nb4 = UIBarButtonItem(title: "Text")
nb4.tintColor = .systemGreen // This works on the text if not changed below with the titleTextAttributes
navigationItem.rightBarButtonItems = [nb1, nb3]
navigationItem.leftBarButtonItems = [nb2, nb4]
self.navigationController?.navigationBar.tintColor = .systemRed // Nothing
self.navigationController?.navigationBar.barTintColor = .systemYellow // Nothing
// This works on the text color but not the others
self.navigationController?.navigationBar.standardAppearance.buttonAppearance.normal.titleTextAttributes = [ .foregroundColor : UIColor.systemPurple ]
}
}
На панели навигации будет отображаться сегментированный элемент управления, текст, переключатель и кнопка.
Текст будет иметь соответствующий цвет в зависимости от того, какой код прокомментирован. Но это не предполагает пользовательское представление.
Переключатель сохраняет свой onTintColor, но не thumTintColor.
Кнопка теряет свой TintColor.
Сегментированный элемент управления теряет свой selectSegmentTintColor.
Установка TintColor для каждого UIBarButtonItem, созданного с помощью пользовательское представление не имеет никакого эффекта.
Подробнее здесь: https://stackoverflow.com/questions/796 ... -in-ios-26
Мобильная версия