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 contentAfter, 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()
    }
}