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

时间:2015-09-19 09:18:33

标签: ios layout text uiview ios9

我想在我的应用程序中包含动态类型,并且我希望它在运行时响应文本大小更改,而不重新启动应用程序(当我重新启动时,它会成功应用新大小)。

我已在我的app委托中实施UIContentSizeCategoryDidChangeNotification,并在applicationDidBecomeActive:上发出通知,通知我的视图控制器。在我的视图控制器的处理程序方法中,我尝试过:

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

但似乎都没有用。它什么都不做。当app变为活动状态时,它被调用(命中断点),并且它会被调用到最前面的视图,但没有任何变化。

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

2 个答案:

答案 0 :(得分:4)

首先,您的UIViewController需要观察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];

希望这有帮助!

答案 1 :(得分:2)

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

您也可以使用“自动调整字体”复选框从IB设置此项。请注意,如果该复选框未与Text Style字体(例如BodyHeadlineSubhead等)配对,则此复选框不会产生任何影响。

enter image description here