我想在我的应用程序中包含动态类型,并且我希望它在运行时响应文本大小更改,而不重新启动应用程序(当我重新启动时,它会成功应用新大小)。
我已在我的app委托中实施UIContentSizeCategoryDidChangeNotification
,并在applicationDidBecomeActive:
上发出通知,通知我的视图控制器。在我的视图控制器的处理程序方法中,我尝试过:
[self.view setNeedsDisplay];
[self.view setNeedsLayout];
[self.view invalidateIntrinsicContentSize];
但似乎都没有用。它什么都不做。当app变为活动状态时,它被调用(命中断点),并且它会被调用到最前面的视图,但没有任何变化。
如何让我的应用在运行时动态响应类型更改?
答案 0 :(得分:4)
首先,您的UIViewController
需要观察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];
希望这有帮助!
答案 1 :(得分:2)