[英]How to detect Dynamic Font size changes from iOS Settings?
在 settings->general->text size 中,更改文本大小后,我必须退出我自己的应用程序才能将大小应用于
[UIFont preferredFontForTextStyle:..]
是否有委托或通知通知我的应用程序重新应用新尺寸?
更新:我尝试了以下但有趣的是,字体大小将在我 BG 并启动应用程序两次后应用。
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fromBg:) name:UIApplicationDidBecomeActiveNotification object:nil];
}
-(void) fromBg:(NSNotification *)noti{
self.headline1.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
self.subHeadline.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];
self.body.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
self.footnote.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote];
self.caption1.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1];
self.caption2.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2];
// [self.view layoutIfNeeded];
}
您在UIContentSizeCategory上侦听大小更改通知。
Swift 3.0: NSNotification.Name.UIContentSizeCategoryDidChange
Swift 4.0或更高版本: UIContentSizeCategory.didChangeNotification
使用Swift 5和iOS 12,您可以选择以下三种解决方案之一来解决您的问题。
UIContentSizeCategoryAdjusting
的adjustsFontForContentSizeCategory
属性 UILabel
, UITextField
和UITextView
符合UIContentSizeCategoryAdjusting
协议,因此具有名为adjustsFontForContentSizeCategory
的实例属性。 adjustsFontForContentSizeCategory
具有以下声明:
一个布尔值,指示当设备的内容大小类别更改时对象是否自动更新其字体。
var adjustsFontForContentSizeCategory: Bool { get set }
下面的UIViewController
实现演示了如何使用adjustsFontForContentSizeCategory
检测iOS设置中的动态字体大小更改并做出反应:
import UIKit
class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
label.numberOfLines = 0
label.font = .preferredFont(forTextStyle: UIFont.TextStyle.body)
label.adjustsFontForContentSizeCategory = true
view.addSubview(label)
// Auto layout
label.translatesAutoresizingMaskIntoConstraints = false
let horizontalConstraint = label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
let verticalConstraint = label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
let widthConstraint = label.widthAnchor.constraint(equalToConstant: 300)
NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint])
}
}
UIContentSizeCategory
的didChangeNotification
类型属性 UIContentSizeCategory
有一个名为didChangeNotification
的type属性。 didChangeNotification
具有以下声明:
用户更改首选内容大小设置时发布。
static let didChangeNotification: NSNotification.Name
当
preferredContentSizeCategory
属性中的值更改时,将发送此通知。 通知的userInfo字典包含newValueUserInfoKey
键,它反映了新设置。
下面的UIViewController
实现演示了如何使用didChangeNotification
检测iOS设置中的动态字体大小更改并做出反应:
import UIKit
class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
label.numberOfLines = 0
label.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body)
view.addSubview(label)
// Register for `UIContentSizeCategory.didChangeNotification`
NotificationCenter.default.addObserver(self, selector: #selector(preferredContentSizeChanged(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil)
// Auto layout
label.translatesAutoresizingMaskIntoConstraints = false
let horizontalConstraint = label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
let verticalConstraint = label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
let widthConstraint = label.widthAnchor.constraint(equalToConstant: 300)
NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint])
}
@objc func preferredContentSizeChanged(_ notification: Notification) {
label.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body)
/* perform other operations if necessary */
}
}
UITraitCollection
的preferredContentSizeCategory
属性 UITraitCollection
有一个名为preferredContentSizeCategory
的属性。 preferredContentSizeCategory
具有以下声明:
用户首选的字体大小调整选项。
var preferredContentSizeCategory: UIContentSizeCategory { get }
使用动态类型,用户可以要求应用程序使用大于或小于系统定义的普通字体大小的字体显示文本。 例如,具有视觉障碍的用户可能会请求更大的默认字体大小,以便更容易阅读文本。 使用此属性的值来请求与用户请求的大小匹配的
UIFont
对象。
下面的UIViewController
实现显示了如何使用preferredContentSizeCategory
检测iOS设置中的动态字体大小更改并做出反应:
import UIKit
class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
label.numberOfLines = 0
label.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body)
view.addSubview(label)
// Auto layout
label.translatesAutoresizingMaskIntoConstraints = false
let horizontalConstraint = label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
let verticalConstraint = label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
let widthConstraint = label.widthAnchor.constraint(equalToConstant: 300)
NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint])
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if previousTraitCollection?.preferredContentSizeCategory != traitCollection.preferredContentSizeCategory {
self.label.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.body)
/* perform other operations if necessary */
}
}
}
资料来源:
您也可以这样做以获得尺寸:
let contentSize = traitCollection.preferredContentSizeCategory
if contentSize.isAccessibilityCategory {
if contentSize >= .accessibilityLarge{
print("larger than or equal to accessibility large")
}else {
print("lower than large")
}
} else {
print("not accessibility")
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.