UILabel从具有动态类型的静态UITableViewCell中消失

时间:2014-10-12 22:15:16

标签: ios objective-c xcode uitableview accessibility

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

除非:

,否则它有效
  1. 打开应用
  2. 打开表格视图
  3. 打开设置更改文字大小(更大的小)
  4. 再次打开应用程序,标签消失。
  5. 转到另一个视图(返回)并再次打开故障表 - 文本已更改且看起来不错
  6. 我设法通过以下黑客来解决这个问题

    - (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方法。

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

    Before, cells with content After, cells without labels

8 个答案:

答案 0 :(得分:5)

我最近使用静态表并试图为其添加动态类型。我得到了与你相同的结果 - 甚至可以在Apple自己的Contacts.app中看到这个消失的标签。

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

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

- (void)prepareForReuse {

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

随着我的表格上方的黑客攻击,他们的字体会动态调整系统首选项的变化。

希望有所帮助。

答案 1 :(得分:3)

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

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

在我的cellForRowAtIndexPath

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

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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

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

即使对于没有程序代码/类

的表视图也是如此

答案 4 :(得分:1)

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

答案 5 :(得分:0)

根据我的经验,这是一个故事板问题,基本的' tableViewCell样式。当收到UIContentSizeCategoryDidChangeNotification时,在Storyboard中设置的textLabel的属性将被遗忘,包括文本本身。我通过在代码中设置所需的textLabel属性(在CellForRowAtIndexPath中)解决了类似的问题。

答案 6 :(得分:0)

标签将从其父视图中删除。试试这个:

override func prepareForReuse() {
    super.prepareForReuse()
    contentView.addSubview(unitLabel)
}

答案 7 :(得分:0)

此问题似乎已在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()
    }
}