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

Can*_*ğlu 4 layout text uiview ios ios9

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

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

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

但是似乎没有任何作用。它什么也没做。当应用程序激活时,它被称为(击中断点),并且确实被最前面的视图调用,但是没有任何变化。

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

Jan*_*edi 5

首先,您UIViewController需要观察UIContentSizeCategoryDidChangeNotification通知(您是)。作为文档,我将举一个例子:

- (void)viewWillAppear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(contentSizeCategoryDidChangeNotification:)
                                                 name:UIContentSizeCategoryDidChangeNotification
                                               object:nil];
}
Run Code Online (Sandbox Code Playgroud)

接下来,我们将定义选择器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]];

    ...
}
Run Code Online (Sandbox Code Playgroud)

+ (UIFont)preferredFontForTextStyle:将为UIFont给定的文本样式返回正确的大小,并根据系统的动态类型内容大小(从XS到调整XXXL)进行调整。

最后,请记住要以观察者身份离开自己:

[[NSNotificationCenter defaultCenter] removeObserver:self];
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!