我如何告诉我所有的自动布局约束来更新自己? (例如,当用户更新他们的系统大小/动态类型时)?

Posted

技术标签:

【中文标题】我如何告诉我所有的自动布局约束来更新自己? (例如,当用户更新他们的系统大小/动态类型时)?【英文标题】:How do I tell all my Auto Layout constraints to update themselves? (For example when user updates their system size/Dynamic Type)? 【发布时间】:2013-11-07 00:12:45 【问题描述】:

我在 ios 7 中为我的应用程序添加了动态类型支持,现在当用户更改他们的系统字体大小然后退出并重新打开应用程序时,它会愉快地更新它。但是,当刚刚启动回应用程序时,我似乎无法让它工作。

我添加了一个观察者:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contentSizeDidChange) name:UIContentSizeCategoryDidChangeNotification object:nil];

当用户改变大小时调用如下方法:

- (void)contentSizeDidChange 
     [self.tableView invalidateIntrinsicContentSize];
     [self.tableView reloadData];

但是我的单元格中的字体大小根本没有改变(尽管单元格的高度会改变)。这是因为我为单元格子类化了 UITableViewCell 吗?

编辑:

这是我的 UITableViewCell 子类中的内容:

- (void)contentSizeDidChange 
    self.fullCellURLLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];
    self.timeLeftLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];
    self.timeLeftLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
    self.fullCellPreviewLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];

【问题讨论】:

我在这里猜测(因为我没有这样做)您必须将每个文本对象上的文本重置为您想要的“首选”大小。当您使用该方法时,它会返回一个静态 UIFont - 字体本身不会在控件“内部”更新。 当用户更改文本大小时,我在 UITableViewCell 子类中添加了我所拥有的内容,但最终的更改并不完全符合他们的预期(有些内容太大,有些变得粗体)。 所以用一个静态视图和一些 uitextfields 做这个测试——谁知道系统会如何随着大小的增加而改变字体?在优化您的真实应用之前,请先在演示项目中进行尝试。 啊,我打错了,字体更新确实有效。让它成为一个答案。 【参考方案1】:

我在这里猜测(因为我没有这样做)您必须将每个文本对象上的文本重置为您想要的“首选”大小。当您使用该方法时,它会返回一个静态 UIFont - 字体本身不会在控件“内部”更新。

所以用一个静态视图和一些 uitextfields 做这个测试 - 谁知道系统会如何随着大小的增加而改变字体?在完善您的真实应用之前,请先在演示项目中进行尝试。

【讨论】:

以上是关于我如何告诉我所有的自动布局约束来更新自己? (例如,当用户更新他们的系统大小/动态类型时)?的主要内容,如果未能解决你的问题,请参考以下文章

表视图的自动布局约束问题

如何在自动布局中滑动表格视图单元格?

同时更新多个视图约束

自动布局问题

为按钮提供相等宽度约束时,自动布局设置不正确

如何获得影响给定子视图的自动布局约束?