如何在动态类型的 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】:首先,您的UIViewController
s 需要观察UIContentSizeCategoryDidChangeNotification
通知(您是)。作为文档,我会留下一个例子:
- (void)viewWillAppear:(BOOL)animated
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(contentSizeCategoryDidChangeNotification:)
name:UIContentSizeCategoryDidChangeNotification
object:nil];
接下来,我们将定义选择器contentSizeCategoryDidChangeNotification:
。这个函数是我们需要显式更新每个 UI 元素的地方(对于UILabel
、UIButton
等)。简单地触发布局传递不会这样做。
例如,假设您有一个标签和按钮:
- (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
,并根据系统动态类型内容大小(范围从XS
到XXXL
)进行调整。
最后,记得移除自己的观察者身份:
[[NSNotificationCenter defaultCenter] removeObserver:self];
希望这会有所帮助!
【讨论】:
【参考方案2】:在 ios 10+ 中,adjustsFontForContentSizeCategory
现在存在。在标签上将此设置为 YES,它将自动更新字体大小,假设您的字体设置为使用 Text Style
字体。
您也可以在 IB 中使用“自动调整字体”复选框进行设置。请注意,如果未与Text Style
字体(如Body
、Headline
、Subhead
等)配对,则此复选框无效。
【讨论】:
你的意思是:“如果不与字体文本样式配对,复选框没有影响。”你能用一个小例子详细说明吗?提前致谢。 当您选择字体时,它必须是“文本样式”才能使动态类型起作用。在提供的屏幕截图中,您可以看到字体设置为“正文”而不是实际字体。以上是关于如何在动态类型的 UIContentSizeCategoryDidChangeNotification 之后调整视图大小的主要内容,如果未能解决你的问题,请参考以下文章
如何在本机反应中禁用文本输入的字体缩放(可访问性的动态类型)?
如何在动态类型的 UIContentSizeCategoryDidChangeNotification 之后调整视图大小