iOS 11中semanticContentAttribute对默认UITableViewCell失效问题求助
我之前也踩过iOS 11这个RTL适配的坑!你用UIView.appearance().semanticContentAttribute = .forceRightToLeft在iOS 10能正常生效,但iOS 11里系统对UITableViewCell内部控件的语义属性处理逻辑有变化,导致默认cell的标签没跟着切换成RTL布局。
这里有几个靠谱的解决办法,你可以按需尝试:
针对UITableViewCell的ContentView设置全局外观
iOS 11中,UITableViewCell的内部标签是嵌套在contentView里的,直接给UIView设置全局属性可能没覆盖到contentView层级。你可以额外添加一行代码:UITableViewCell.appearance().contentView.semanticContentAttribute = .forceRightToLeft这样能确保cell内部的所有子控件继承contentView的RTL语义属性。
直接给UILabel设置全局外观
如果上面的方法效果不佳,你可以直接针对所有UILabel强制设置RTL属性,覆盖系统默认的LTR:UILabel.appearance().semanticContentAttribute = .forceRightToLeft这个方式更直接,能确保所有标签都遵循RTL布局,但要注意如果有个别不需要RTL的标签,需要单独给它们设置回
.forceLeftToRight。在Cell配置时手动设置
如果你不想全局修改,也可以在tableView(_:cellForRowAt:)方法里,针对系统cell的标签手动设置语义属性:cell.textLabel?.semanticContentAttribute = .forceRightToLeft cell.detailTextLabel?.semanticContentAttribute = .forceRightToLeft这种方式灵活性更高,适合只需要部分cell做RTL适配的场景。
另外补充一点:iOS 11及以后,系统对自动布局的RTL支持更严格,如果你有自定义约束,一定要用leading/trailing而非left/right,这样才能自动适配RTL方向。
内容的提问来源于stack exchange,提问作者Ahmed Fathi

