【问题标题】:UILabel in UITableViewCell in .xib file ignores Dark Mode.xib 文件中 UITableViewCell 中的 UILabel 忽略暗模式
【发布时间】:2019-12-25 07:17:04
【问题描述】:

我在.xib 文件中有我的自定义UITableViewCells。由于 Xcode 11 Beta 5(也使用 Beta 6 进行了测试)我的UILabels 忽略了深色模式并且文本始终为黑色。我已将UILabel 文本颜色设置为默认(标签颜色),因此这应该会自动更改。有没有人知道出了什么问题?

这是一个屏幕截图:第一个单元格是基本单元格,第二个是.xib 文件中的自定义单元格。

【问题讨论】:

  • 我有同样的问题,但它似乎扩展到所有 nib 文件(不仅仅是 UITableViewCells)。这也是你的经历吗?如果部署目标是 iOS13,它可以正常工作,但如果您将其降低到 iOS12,它将无法正常工作。
  • 奇怪的是背景动态颜色可以正常工作,但标签不能正常工作。这对我实现暗模式有点阻碍......

标签: ios xcode ios13 ios-darkmode


【解决方案1】:

这似乎是 Xcode 11 中的错误(在 beta 7 和 GM Seed 1 中测试) - 我已通过反馈助手 (FB7198213) 向 Apple 提交了此问题。问题是 Xcode 11 GM Seed 2 中的fixed

对于以前版本的 Xcode 11,动态标签颜色不正确行为的解决方法是在表格视图单元格子类中的 awakeFromNib() 中重新分配标签颜色。例如:

class TableCell: UITableViewCell {

    @IBOutlet private weak var label: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        if #available(iOS 13.0, *) {
            // The label's textColor was set to secondaryLabel in the XIB editor
            // but we reassign it to secondaryLabel again here. This prevents
            // a bug where the label always appears in its light mode variant.
            label.textColor = .secondaryLabel
        }
    }
}

原答案: 这个原始答案仅解决了默认(即主要)标签颜色的问题

Xcode 11(在 beta 7 中测试)中的 XIB editor 中似乎存在一个关于编辑标签颜色的错误。当在 XIB 编辑器中将标签颜色设置为“标签颜色”时(即使它已经设置为该颜色),底层 XML 的修改方式会导致标签即使在暗模式下也显示为黑色。在创建新标签和将该标签的颜色显式设置为“标签颜色”之后检查 XIB 文件的差异,可以看到差异。

对于我的简单示例,XIB 文件的 XML 来自:

<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Text here" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VKH-gX-gtO">
   <rect key="frame" x="20" y="15" width="71" height="21"/>
   <fontDescription key="fontDescription" type="system" pointSize="17"/>
   <nil key="textColor"/>
   <nil key="highlightedColor"/>
</label>

到:

<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Text here" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VKH-gX-gtO">
   <rect key="frame" x="20" y="15" width="71" height="21"/>
   <fontDescription key="fontDescription" type="system" pointSize="17"/>
   <nil key="highlightedColor"/>
</label>

请注意,&lt;nil key="textColor"/&gt; 行已被删除。手动添加此选项可修复标签在暗模式下的行为。

【讨论】:

  • iOS 13.1 Beta 3 和 iOS 13 GM 似乎修复了该错误。我还将我的 Xcode 更新为 11 GM。不再需要 awakeFromNib 调用。
  • 添加 并不能解决暗模式的问题。您也必须提供颜色。
【解决方案2】:

这里有类似的问题。启用深色模式后,XIB 中使用的某些动态颜色不会使用其深色版本。

这在模拟器和真实设备上都会发生。在 Xcode (Interface Builder) 中模拟暗模式时,颜色确实正确显示。

我的项目部署目标是 iOS 10。

【讨论】:

  • 我的项目部署目标是iOS 11
【解决方案3】:

今天发布的 Xcode 11 GM Seed 2 似乎解决了这个问题。

来自release note

修复了 XIB 文件中的系统颜色设置为之前部署的问题 iOS 13.0 不会在运行时适应系统外观。 (54362252)

【讨论】:

  • 不,没有得到修复。甚至没有 11.1
【解决方案4】:

@Andrew Bennet 这对我有用。谢谢你。我不得不在 Objective-C 中实现这项工作,因为我的应用程序的这一部分仍在 Objective-C 中。

- (void)awakeFromNib {
    [super awakeFromNib];
    if (@available(iOS 13.0, *)) {
        // The label's textColor was set to secondaryLabel in the XIB editor
        // but we reassign it to secondaryLabel again here. This prevents
        // a bug where the label always appears in its light mode variant.
//        label.textColor = .secondaryLabel
        lblTitle.textColor = UIColor.secondaryLabelColor;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2021-11-01
    • 1970-01-01
    • 2016-08-01
    • 2022-01-22
    • 2022-12-07
    • 1970-01-01
    相关资源
    最近更新 更多