【问题标题】:UILabel Disappear From Static UITableViewCell with Dynamic TypeUILabel 从具有动态类型的静态 UITableViewCell 中消失
【发布时间】:2014-12-07 11:04:24
【问题描述】:

我有带有基本样式单元格的静态UITableView,默认为 44 高度。每个单元格中都有一个带有正文文本样式的标签。这样我就可以免费获得动态类型行为。

它可以工作,除非:

  1. 打开应用
  2. 打开表格视图
  3. 打开设置并更改文本大小(从大到小)
  4. 再次打开应用,标签消失。
  5. 转到另一个视图(返回)并再次打开问题表 — 文本已更改,看起来不错

我设法通过以下 hack 解决了这个问题

- (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,但这不起作用。我尝试了细胞和标签的插座。我尝试了reloadDatasetNeedsLayout 方法。

这里是图片。标签为黄色,内容视图为蓝色:

【问题讨论】:

  • 这仍然是 iOS 12.1 中的一个错误
  • FWIW,这似乎已在 Xcode 11 / iOS 13 中解决

标签: ios objective-c xcode uitableview accessibility


【解决方案1】:

我最近玩过静态表并尝试向它添加动态类型。我得到了和你一样的结果——甚至可以在 Apple 自己的 Contacts.app 中看到这个消失的标签。

即使在将我的表格从静态更改为动态并实现包含 UILabel(在 XIB 中将字体配置为 UIFontTextStyleBody 的字体)的小型自定义单元格之后,在系统中更改首选文本大小时,表格似乎仍然没有更新其内容偏好。

但是:我在执行以下操作后意外得到了一些结果:在我的自定义单元格的子类中,我实现了 prepareForReuse 并将标签的字体重新初始化为正确的样式:

- (void)prepareForReuse {

    self.label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
}

通过上面的 hack,我的表格单元格会根据系统偏好的变化动态调整其字体。

希望对您有所帮助。

【讨论】:

  • 感谢分享,我在其他静态表上试过了,没有用。我仍然需要在preferredContentSizeChanged 通知上重新创建标签文本。
  • 不,我上面的“解决方案”不适用于静态表格,但我认为内部问题是相同的:单元格中的标签没有正确更新为新字体 - 可能是因为缓存过多。
  • 我明白了,在我的回答中,我正在执行同一行代码。只有我在UITableViewControllercellForRowAtIndexPath 方法中这样做。
【解决方案2】:

我将表格更改为动态并实现cellForRowAtIndexPath: 方法以在代码中分配表格标签。这对我没有帮助。

接下来,我将表格视图单元格样式从 basic 更改为 custom。 我必须添加自己的标签并在 Storyboard 中设置 AutoLayout 约束。这解决了这个问题。不再需要preferredContentSizeChanged 通知。

在我的cellForRowAtIndexPath

cell.label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];

我稍后会提交一份 Apple 雷达。看起来我们不能将动态类型与静态表一起使用。

祝你好运,请在你的应用中实现动态类型。这是值得的。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,想不用代码解决这个问题。所以我改变了

    • 从基本到自定义的静态单元格类型,
    • 添加了我自己的标签
    • 添加了前导、尾随和垂直中心约束,
    • 将标签上的动态类型复选框设置为开启
    • 和标签的字体到文本样式正文。 -

    这甚至适用于没有程序代码/类的表格视图

    【讨论】:

    • 这行得通,但不幸的是,只能通过将类设置为“自定义”并添加约束,如上所述。
    【解决方案4】:

    如果你自己连接textLabeldetailTextLabel的插座, 请删除插座。 您将使用 UITableViewCell 的属性。

    open class UITableViewCell {
        open var textLabel: UILabel? { get }     
        open var detailTextLabel: UILabel? { get } 
    

    【讨论】:

      【解决方案5】:

      尝试添加 [self.table reloadData];在您首选的ContentSizeChanged 方法中。

      【讨论】:

      • 错误地投了赞成票(不能投反对票)。没用。
      【解决方案6】:

      根据我的经验,这是“基本”tableViewCell 样式的情节提要问题。当收到 UIContentSizeCategoryDidChangeNotification 时,在 Storyboard 中设置的 textLabel 的属性将被“忘记”,包括文本本身。我通过在代码中设置所需的 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()
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-02
            • 2012-04-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多