我在标准UITableViewCell的textLabel上设置adjustsFontForContentSizeCategory。当我转到“设置”,“常规”,“辅助功能”,“更大文本”来更改字体大小然后再返回到我的应用程序时,UITableViewCell的UILabel会相应地进行更改。这应该不会发生,是吗?
adjustsFontForContentSizeCategory的目的究竟是什么?如何防止UITableViewCells标签更改字体大小?
答案 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 ,因此不需要此最新属性。这就是为什么您没有明确执行此操作而注意到此行为的原因。