我有基本样式单元格的静态UITableView
,默认高度为44。每个单元格中都有一个带有Body文本样式的标签。这样我就可以免费获得动态类型行为。
除非:
,否则它有效我设法通过以下黑客来解决这个问题
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(preferredContentSizeChanged)
name:UIContentSizeCategoryDidChangeNotification object:nil];
}
- (void)preferredContentSizeChanged
{
// adjust the layout of the cells
// for some reason text from labels are disappear
self.statusBarCell.textLabel.text = @"Status bar";
self.itemColorCell.textLabel.text = @"Color";
但是我有另一个完全相同的UITableView
,这是行不通的。我试过细胞和标签的出口。我尝试了reloadData
和setNeedsLayout
方法。
这是照片。标签为黄色,内容视图为蓝色:
答案 0 :(得分:5)
我最近使用静态表并试图为其添加动态类型。我得到了与你相同的结果 - 甚至可以在Apple自己的Contacts.app中看到这个消失的标签。
即使将我的表从静态更改为动态并实现包含UILabel的小型自定义单元格(在XIB中配置为字体为UIFontTextStyleBody),在更改系统中的首选文本大小时,该表似乎仍未更新其内容prefrences。
但是:我在执行以下操作后意外得到了一些结果:在我的自定义单元格的子类中,我实现了prepareForReuse并将标签的字体重新初始化为正确的样式:
- (void)prepareForReuse {
self.label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
}
随着我的表格上方的黑客攻击,他们的字体会动态调整系统首选项的变化。
希望有所帮助。
答案 1 :(得分:3)
我将表更改为动态实现的cellForRowAtIndexPath:
方法,以在代码中分配表标签。这对我没有帮助。
接下来,我将表格视图单元格样式从基本更改为自定义。我必须添加自己的标签并在Storyboard中设置AutoLayout约束。这解决了这个问题。 preferredContentSizeChanged
通知不是必须的。
在我的cellForRowAtIndexPath
:
cell.label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
我稍后会提交Apple雷达。看起来我们不能将Dynamic Type与静态表一起使用。
祝您好运,请在您的应用中实施动态类型。这是值得的。
答案 2 :(得分:2)
如果您自己连接textLabel
,detailTextLabel
的插座,
请删除插座。
并且您将使用UITableViewCell的属性。
open class UITableViewCell {
open var textLabel: UILabel? { get }
open var detailTextLabel: UILabel? { get }
答案 3 :(得分:2)
我遇到了同样的问题,想要解决这个没有代码。所以我改变了
即使对于没有程序代码/类
的表视图也是如此答案 4 :(得分:1)
尝试添加[self.table reloadData];在您的preferredContentSizeChanged方法中。
答案 5 :(得分:0)
根据我的经验,这是一个故事板问题,基本的' tableViewCell样式。当收到UIContentSizeCategoryDidChangeNotification时,在Storyboard中设置的textLabel的属性将被遗忘,包括文本本身。我通过在代码中设置所需的textLabel属性(在CellForRowAtIndexPath中)解决了类似的问题。
答案 6 :(得分:0)
标签将从其父视图中删除。试试这个:
override func prepareForReuse() {
super.prepareForReuse()
contentView.addSubview(unitLabel)
}
答案 7 :(得分:0)
此问题似乎已在iOS 13中得到解决,但这是以前版本的解决方法...
删除发送到表格视图的有关尺寸类别更改的通知-这将停止表格视图的自动更新
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.removeObserver(tableView!, name: UIContentSizeCategory.didChangeNotification, object: nil)
}
然后自己更新表格...
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
if previousTraitCollection?.preferredContentSizeCategory != traitCollection.preferredContentSizeCategory {
tableView.reloadData()
}
}