52

在设置->常规->文本大小中,更改文本大小后,我必须退出我自己的应用程序才能将大小应用于

 [UIFont preferredFontForTextStyle:..]

是否有代表或通知通知我的应用重新应用新尺寸?

更新:我尝试了以下但有趣的是,字体大小将在我 BG 并启动应用程序 TWICE 后应用。

- (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];

}
4

2 回答 2

60

您在UIContentSizeCategory上收听大小更改通知。

斯威夫特 3.0: NSNotification.Name.UIContentSizeCategoryDidChange

Swift 4.0 或更高版本: UIContentSizeCategory.didChangeNotification

于 2013-09-23T03:28:47.870 回答
55

使用 Swift 5 和 iOS 12,您可以选择以下三种解决方案之一来解决您的问题。


#1。使用UIContentSizeCategoryAdjustingadjustsFontForContentSizeCategory属性

UILabel,UITextFieldUITextView符合UIContentSizeCategoryAdjusting协议,因此有一个名为 . 的实例属性adjustsFontForContentSizeCategoryadjustsFontForContentSizeCategory有以下声明:

一个布尔值,指示对象是否在设备的内容大小类别更改时自动更新其字体。

var adjustsFontForContentSizeCategory: Bool { get set }

下面的UIViewController实现展示了如何检测和响应 iOS 设置中的动态字体大小变化adjustsFontForContentSizeCategory

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])
    }

}

#2。使用UIContentSizeCategorydidChangeNotification类型属性

UIContentSizeCategory有一个名为 的类型属性didChangeNotificationdidChangeNotification有以下声明:

当用户更改首选内容大小设置时发布。

static let didChangeNotification: NSNotification.Name

preferredContentSizeCategory当属性中的值更改时发送此通知。通知的 userInfo 字典包含newValueUserInfoKey反映新设置的键。

下面的UIViewController实现展示了如何检测和响应 iOS 设置中的动态字体大小变化didChangeNotification

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 */
    }

}

#3。使用UITraitCollectionpreferredContentSizeCategory属性

UITraitCollection有一个名为 的属性preferredContentSizeCategorypreferredContentSizeCategory有以下声明:

用户首选的字体大小选项。

var preferredContentSizeCategory: UIContentSizeCategory { get }

使用动态类型,用户可以要求应用使用大于或小于系统定义的正常字体大小的字体显示文本。例如,有视觉障碍的用户可能会要求更大的默认字体大小,以便更容易阅读文本。使用此属性的值来请求UIFont与用户请求的大小相匹配的对象。

下面的UIViewController实现展示了如何检测和响应 iOS 设置中的动态字体大小变化preferredContentSizeCategory

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 */
        }
    }

}

资料来源:

于 2017-08-06T20:50:59.233 回答