如何在动态类型的 UIContentSizeCategoryDidChangeNotification 之后调整视图大小

Posted

技术标签:

【中文标题】如何在动态类型的 UIContentSizeCategoryDidChangeNotification 之后调整视图大小【英文标题】:How to resize views after dynamic type's UIContentSizeCategoryDidChangeNotification 【发布时间】:2015-09-19 09:18:33 【问题描述】:

我想在我的应用中采用动态类型,并且我希望它在运行时响应文本大小的变化,而无需重新启动应用(当我重新启动时,它会成功应用新大小)。

我在我的应用程序委托中实现了UIContentSizeCategoryDidChangeNotification,并在applicationDidBecomeActive: 上触发了通知,通知我的视图控制器。在我的视图控制器的处理程序方法中,我尝试过:

[self.view setNeedsDisplay]; [self.view setNeedsLayout]; [self.view invalidateIntrinsicContentSize];

但似乎没有一个工作。它什么也不做。当应用程序处于活动状态时调用它(到达断点),并且确实会为最前面的视图调用它,但没有任何变化。

如何让我的应用在运行时动态响应类型变化?

【问题讨论】:

【参考方案1】:

首先,您的UIViewControllers 需要观察UIContentSizeCategoryDidChangeNotification 通知(您是)。作为文档,我会留下一个例子:

- (void)viewWillAppear:(BOOL)animated 
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(contentSizeCategoryDidChangeNotification:)
                                                 name:UIContentSizeCategoryDidChangeNotification
                                               object:nil];

接下来,我们将定义选择器contentSizeCategoryDidChangeNotification:。这个函数是我们需要显式更新每个 UI 元素的地方(对于UILabelUIButton 等)。简单地触发布局传递不会这样做。

例如,假设您有一个标签和按钮:

- (void)contentSizeCategoryDidChangeNotification 

    // Updating a UILabel's size for a given text style:
    self.headlineLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];

    // Similarly, updating a UIButton's size for a given style:
    [self.button.titleLabel setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleBody]];

    ...

+ (UIFont)preferredFontForTextStyle: 将为给定的text style 返回正确大小的UIFont,并根据系统动态类型内容大小(范围从XSXXXL)进行调整。

最后,记得移除自己的观察者身份:

[[NSNotificationCenter defaultCenter] removeObserver:self];

希望这会有所帮助!

【讨论】:

【参考方案2】:

ios 10+ 中,adjustsFontForContentSizeCategory现在存在。在标签上将此设置为 YES,它将自动更新字体大小,假设您的字体设置为使用 Text Style 字体。

您也可以在 IB 中使用“自动调整字体”复选框进行设置。请注意,如果未与Text Style 字体(如BodyHeadlineSubhead 等)配对,则此复选框无效。

【讨论】:

你的意思是:“如果不与字体文本样式配对,复选框没有影响。”你能用一个小例子详细说明吗?提前致谢。 当您选择字体时,它必须是“文本样式”才能使动态类型起作用。在提供的屏幕截图中,您可以看到字体设置为“正文”而不是实际字体。

以上是关于如何在动态类型的 UIContentSizeCategoryDidChangeNotification 之后调整视图大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QML 中创建 PyQT 注册类型的动态实例

如何在本机反应中禁用文本输入的字体缩放(可访问性的动态类型)?

如何在动态类型的 UIContentSizeCategoryDidChangeNotification 之后调整视图大小

如何在 oracle 中使用动态 sql 创建记录类型?

如何在手表上测试不同的字体大小(动态类型)?

如何动态设置数据:图像/文件类型?