Can*_*ğlu 4 layout text uiview ios ios9
我想在我的应用程序中包含动态类型,并且希望它在运行时能够响应文本大小更改,而无需重新启动应用程序(当我重新启动时,它会成功应用新大小)。
我已经UIContentSizeCategoryDidChangeNotification在我的应用程序委托中实现了,并在上触发了一个通知applicationDidBecomeActive:,通知我的视图控制器。在视图控制器的处理程序方法中,我尝试过:
[self.view setNeedsDisplay];[self.view setNeedsLayout];[self.view invalidateIntrinsicContentSize];但是似乎没有任何作用。它什么也没做。当应用程序激活时,它被称为(击中断点),并且确实被最前面的视图调用,但是没有任何变化。
如何在运行时使我的应用动态响应类型更改?
首先,您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元素(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]];
...
}
Run Code Online (Sandbox Code Playgroud)
+ (UIFont)preferredFontForTextStyle:将为UIFont给定的文本样式返回正确的大小,并根据系统的动态类型内容大小(从XS到调整XXXL)进行调整。
最后,请记住要以观察者身份离开自己:
[[NSNotificationCenter defaultCenter] removeObserver:self];
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!