在iOS 10中adjustsFontForContentSizeCategory的目的是什么?

时间:2016-11-09 10:07:49

标签: ios fonts accessibility

我在标准UITableViewCell的textLabel上设置adjustsFontForContentSizeCategory。当我转到“设置”,“常规”,“辅助功能”,“更大文本”来更改字体大小然后再返回到我的应用程序时,UITableViewCell的UILabel会相应地进行更改。这应该不会发生,是吗?

adjustsFontForContentSizeCategory的目的究竟是什么?如何防止UITableViewCells标签更改字体大小?

3 个答案:

答案 0 :(得分:7)

在我们进入表格视图之前,让我们讨论一下adjustsFontForContentSizeCategory。这样做的目的是控件将自动调整我们的字体。在此之前,您必须手动添加UIContentSizeCategoryDidChangeNotification的观察者。

因此,例如,在Swift 3中,在10之前的iOS版本中,为了在用户更改其首选字体大小时更新字体,我们必须执行以下操作:

class ViewController: UIViewController {

    @IBOutlet weak var dynamicTextLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        dynamicTextLabel.font = .preferredFont(forTextStyle: .body)

        NotificationCenter.default.addObserver(forName: .UIContentSizeCategoryDidChange, object: nil, queue: .main) { [weak self] notification in
            self?.dynamicTextLabel.font = .preferredFont(forTextStyle: .body)
        }
    }

    deinit {
        NotificationCenter.default.removeObserver(self, name: .UIContentSizeCategoryDidChange, object: nil)
    }
}

在iOS 10中,我们可以使用adjustsFontForContentSizeCategory并且不再需要观察者,将上述内容简化为:

class ViewController: UIViewController {

    @IBOutlet weak var dynamicTextLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        dynamicTextLabel.font = .preferredFont(forTextStyle: .body)
        dynamicTextLabel.adjustsFontForContentSizeCategory = true
    }
}

好的,据说,表格视图会自动观察UIContentSizeCategoryDidChangeNotification。是否看到文本大小调整是否是在单元格标签上使用动态类型的产物。如果你使用动态文本,如下所示,你会看到表格更新,因为系统的首选字体大小发生了变化(不使用adjustsFontForContentSizeCategory):

class ViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // make sure the cell resizes for the font with the following two lines

        tableView.estimatedRowHeight = 44
        tableView.rowHeight = UITableViewAutomaticDimension
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1000
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.font = .preferredFont(forTextStyle: .body)
        // cell.textLabel?.adjustsFontForContentSizeCategory = true
        cell.textLabel?.text = "Row \(indexPath.row)"
        return cell
    }
}

正如您所看到的,我唯一要做的就是将字体设置为动态文本,并自动更新表格。根据我的经验,在表视图中,不需要adjustsFontForContentSizeCategory(看起来表视图必须遵守必要的通知本身),但如果您没有体验自动调整大小,则可以随时设置它行为。

如果您明确不希望更改表格视图单元格的标签字体,那么就不要使用动态文本,例如:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.textLabel?.font = .systemFont(ofSize: 17)
    cell.textLabel?.text = "Row \(indexPath.row)"
    return cell
}

答案 1 :(得分:0)

基本上 adjustsFontForContentSizeCategory 动态更改UILabel的字体大小。

答案 2 :(得分:0)

动态类型仅适用于已实现text styles的文本。

因此,如果您始终要禁用动态类型并在单元格中显示相同大小的类型,请不要使用文本样式,也不要使用image size adjustment

如@ User511和@Rob所述,属性adjustsFontForContentSizeCategory告诉系统为其所属对象自动处理动态类型(必须使用文本样式课程)

使用设置更改内容大小时,由于表格视图单元格具有 self-sizing feature ,因此不需要此最新属性。这就是为什么您没有明确执行此操作而注意到此行为的原因。

相关问题