Невозможно настроить оттенок пользовательского представления в UIBarButtonItem в iOS 26.IOS

Программируем под IOS
Ответить
Anonymous
 Невозможно настроить оттенок пользовательского представления в UIBarButtonItem в iOS 26.

Сообщение Anonymous »

В iOS 26 внешний вид навигационных панелей и панелей инструментов немного изменился. У меня возникла проблема при попытке оттенить добавленные элементы. Для «стандартных» экземпляров UIBarButtonItem вы просто устанавливаете TintColor, и все работает нормально. Например:

Код: Выделить всё

let itemText = UIBarButtonItem(title: "Text")
itemText.tintColor = .systemGreen
Текст будет отображаться зеленым на панели инструментов или панели навигации. То же самое работает, как и ожидалось, если оно создано с использованием изображения символа SF.
Проблема возникает, когда мне нужно создать 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 ]
}
}
Запустите это на симуляторе или устройстве iOS 26. В центре экрана будет отображаться кнопка правильного цвета, сегментированный элемент управления и переключатель.
На панели навигации будет отображаться сегментированный элемент управления, текст, переключатель и кнопка.
Текст будет иметь соответствующий цвет в зависимости от того, какой код прокомментирован. Но это не предполагает пользовательское представление.
Переключатель сохраняет свой onTintColor, но не thumTintColor.
Кнопка теряет свой TintColor.
Сегментированный элемент управления теряет свой selectSegmentTintColor.
Установка TintColor для каждого UIBarButtonItem, созданного с помощью пользовательское представление не имеет никакого эффекта.

Подробнее здесь: https://stackoverflow.com/questions/796 ... -in-ios-26
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»