У меня есть несколько элементов управления сегментами пользовательского интерфейса в приложении для iOS, написанных быстро.
Во время моделирования на устройстве iOS при начальной загрузке они используют правильный настраиваемый шрифт, установленный в коде, но в некоторых случаях, когда я перехожу к другим представлениям и возвращаюсь, шрифты на вкладках управления сегментами, кажется, автоматически возвращаются к системным шрифтам.
Что вызывает эту проблему?
Я создаю все свои сегментированные элементы управления, используя эту функцию в каждом контроллере представления. Здесь устанавливаются пользовательские шрифты.
override func viewDidLoad() {
super.viewDidLoad()
isHirer = AppSettings.boolValue(.isHirer)
setupUI()
setupSegmentControl()
downloadData()
configureLocationManager()
}
func setupSegmentControl() {
var items = [String]()
items = AppSettings.boolValue(.isHirer) ? ["Posts", "Manage"] : ["Search", "Manage"]
let segmentedControl = UISegmentedControl(items: items)
segmentedControl.selectedSegmentIndex = 0
UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor:UIColor.init(displayP3Red: 0/255, green: 0/255, blue: 0/255, alpha: 1), NSAttributedString.Key.font : UIFont.init(name: "Cabin-SemiBold", size: 16)!], for: .selected)
UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor:UIColor.init(displayP3Red: 138/255, green: 145/255, blue: 172/255, alpha: 0.7), NSAttributedString.Key.font : UIFont.init(name: "Cabin-SemiBold", size: 16)!], for: .normal)
segmentedControl.frame = CGRect.init(x: 0, y: 42, width: tableView.frame.width/2-20, height: 48)
if AppSettings.boolValue(.isHirer) {
segmentedControl.setContentOffset(CGSize(width: 0, height: -5), forSegmentAt: 0)
segmentedControl.setContentOffset(CGSize(width: 0, height: -5), forSegmentAt: 1)
} else {
segmentedControl.setContentOffset(CGSize(width: 5, height: -5), forSegmentAt: 0)
segmentedControl.setContentOffset(CGSize(width: 0, height: -5), forSegmentAt: 1)
}
segmentedControl.setBackgroundImage(backgroundWithColor(color: .backgroundGray, frame: CGRect(x: 0, y: 0, width: segmentedControl.frame.width, height: segmentedControl.frame.height)), for: .normal, barMetrics: .default)
segmentedControl.setDividerImage(imageWithColor(color: UIColor.white), forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
segmentedControl.addTarget(self, action: #selector(showSection), for: .valueChanged)
seg = segmentedControl
}
@objc func showSection(sender: UISegmentedControl) {
switch sender.selectedSegmentIndex {
case 0:
isSegment0 = true
tableView.reloadData()
case 1:
isSegment0 = false
tableView.reloadData()
default:
break
}
}
Затем в ViewForHeaderInSection функция табличного представления добавила сегмент в представление заголовка.
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == 0 && AppSettings.boolValue(.isHirer) || section == 0 && !AppSettings.boolValue(.isHirer) {
let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.width, height: 90))
headerView.backgroundColor = .backgroundGray
let segmentControl = seg
segmentControl.tag = section
headerView.addSubview(segmentControl)
return headerView
@CSmith тоже добавил мой код
Нет, вы не показываете, как / когда вызывается этот метод. Идея использования здесь статического метода уже довольно сомнительна. А зачем обработчик завершения ?? Это не асинхронно. Очень странно.
@matt, мой плохой, потерялся в моем собственном коде, это было просто то, что я изначально тестировал, чтобы быстрее создавать сегментированные элементы управления и воспроизводить его через контроллеры, которые он не использует. Я обновил фактический используемый код.
по-прежнему чего-то не хватает, ваш код setupSegmentControl() создает UISegmentedControl и назначает его, предположительно, переменной класса с именем seg, но мы не видим, как этот элемент управления добавляется в вашу иерархию представлений ... т.е. что вы делаете с seg?
@CSmith i; m, затем добавив seg в функцию viewForHeaderInSection табличного представления. Это огромная функция, потому что есть много других разделов, поэтому я не копировал ее здесь, а просто добавлял сегмент в представление заголовка для этого конкретного раздела.





Пожалуйста, попробуйте изменить свой код следующим образом:
Перед:
UISegmentedControl.appearance().setTitleTextAttributes(...)
После:
segmentedControl.setTitleTextAttributes(...)
т.е. не использовать прокси внешнего вида в классе UISegmentedControl
Прокси-сервер внешнего вида обычно выполняется один раз в приложении на ранней стадии его жизненного цикла. перед создаются экземпляры любых элементов управления этого класса. Например, вместо этого вы можете использовать прокси внешнего вида в API AppDelegates didFinishLaunching(), это заменит необходимость вызова setTitleTextAttributes() в другом месте вашего кода.
Сообщите, если это поможет.
Я внес изменение, непонятно, что заставляет его измениться. Пользовательские шрифты применяются изначально при загрузке, но после перемещения и выполнения других действий в приложении что-то заставляет шрифт этих элементов управления возвращаться в систему, но это происходит только спорадически, поэтому их трудно воспроизвести. Я протестирую все, что могу, и сообщу, является ли это решением. Спасибо
убедитесь, что вы не вызываете UISegmentedControl.appearance().setTitleTextAttributes() в любом месте вашего кода, если только вы не решите сделать это один раз, как описано в моем отредактированном ответе.
пожалуйста, дополните свой вопрос соответствующим кодом и снимками экрана, вы не предоставили достаточно информации, чтобы кто-либо мог помочь