UILabel исчез из статического UITableViewCell с динамическим типом
У меня есть статический UITableView
с ячейками Basic style, по умолчанию 44 height. В каждой ячейке есть ярлык с текстом Body Text. Таким образом, я получаю динамическое поведение типа бесплатно.
Работает, за исключением if:
- Откройте приложение
- Открыть представление таблицы
- Открыть Настройки изменить размер текста (больше по размеру)
- Откройте приложение снова, метки исчезнут.
- Перейдите в другое представление (назад) и снова откройте проблемную таблицу - текст изменен и выглядит хорошо
Мне удалось исправить это следующим хаком
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(preferredContentSizeChanged)
name:UIContentSizeCategoryDidChangeNotification object:nil];
}
- (void)preferredContentSizeChanged
{
// adjust the layout of the cells
// for some reason text from labels are disappear
self.statusBarCell.textLabel.text = @"Status bar";
self.itemColorCell.textLabel.text = @"Color";
Но у меня есть другой точно такой же UITableView
, и это не работает. Я пробовал выходы для ячеек и ярлыков. Я пробовал методы reloadData
и setNeedsLayout
.
Вот фотографии. Ярлыки желтые, а содержимое - синее:
![Before, cells with content]()
![After, cells without labels]()
Ответы
Ответ 1
У меня была такая же проблема, и мне хотелось решить этот без кода. Поэтому я изменил
- статический тип ячейки от базового до пользовательского,
- добавлен собственный ярлык
- добавлены ведущие, конечные и вертикальные ограничения по центру,
- установите флажок динамического типа на ярлыке на
- и шрифт ярлыка для тела текстовых стилей. -
Это работает даже для представлений таблиц, у которых нет кода программы/класса
Ответ 2
Недавно я играл со статическими таблицами и пытался добавить к нему динамический тип. Я получил те же результаты, что и вы, - даже можно увидеть эту исчезающую метку в собственном приложении Apple.app. Apple.
Даже после изменения моей таблицы из статики в динамическую и реализации небольшой пользовательской ячейки, содержащей UILabel (с настройкой шрифта как UIFontTextStyleBody в XIB), таблица, похоже, не обновляла ее содержимое при изменении предпочтительного размера текста в системе prefrences.
Однако: я случайно получил некоторые результаты после выполнения следующих действий: в подклассе для моей пользовательской ячейки я внедрил prepareForReuse и повторно инициализировал шрифт метки в правильном стиле:
- (void)prepareForReuse {
self.label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
}
С помощью взлома над моими ячейками таблицы динамически изменяет свои шрифты на изменения в системных настройках.
Надеюсь, что это поможет.
Ответ 3
Я изменил таблицу на динамический и реализованный метод cellForRowAtIndexPath:
, чтобы назначить метку таблицы в коде. Это мне не помогло.
Затем я изменил стиль ячейки таблицы таблицы с основного на . Мне пришлось добавить свой собственный ярлык и настроить ограничения AutoLayout в Storyboard. Это решает проблему. preferredContentSizeChanged
уведомление не требует необходимости.
В моем cellForRowAtIndexPath
:
cell.label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
Я буду использовать радар Apple позже. Похоже, мы не можем использовать Dynamic Type со статическими таблицами.
Удачи и попробуйте реализовать Dynamic Type в ваших приложениях. Это того стоит.
Ответ 4
Если вы подключили выход textLabel
, detailTextLabel
самостоятельно,
пожалуйста, удалите розетку.
и вы будете использовать свойства UITableViewCell.
open class UITableViewCell {
open var textLabel: UILabel? { get }
open var detailTextLabel: UILabel? { get }
Ответ 5
Попробуйте добавить [self.table reloadData]; в вашем предпочтительном методеContentSizeChanged.
Ответ 6
По моему опыту, это проблема раскадровки с "базовым" стилем tableViewCell. Когда получен UIContentSizeCategoryDidChangeNotification, атрибуты textLabel, которые были установлены в Storyboard, "забыты", включая сам текст. Я решил аналогичную проблему, установив необходимые атрибуты textLabel в коде вместо (в CellForRowAtIndexPath).
Ответ 7
Метка выходит из родительского представления. Попробуйте следующее:
override func prepareForReuse() {
super.prepareForReuse()
contentView.addSubview(unitLabel)
}
Ответ 8
Эта проблема, кажется, была решена в iOS 13, но здесь есть обходной путь для предыдущих версий...
Удалите уведомление, отправленное в табличное представление об изменении категории размера - это остановит автоматическое обновление табличного представления
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.removeObserver(tableView!, name: UIContentSizeCategory.didChangeNotification, object: nil)
}
Затем обновите таблицу самостоятельно...
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
if previousTraitCollection?.preferredContentSizeCategory != traitCollection.preferredContentSizeCategory {
tableView.reloadData()
}
}