7

我当前的应用程序是用 objC 和 Swift 开发的。我需要支持暗模式。谁能建议我如何在全球范围内实现这一目标?

4

4 回答 4

7

这是添加颜色逻辑的代码,应该出现在暗模式下。

if self.traitCollection.userInterfaceStyle == .dark {

  //Add your Dark mode colors here
 } else {

  //Your normal colors should appear here
 }

要了解有关在 iOS 应用程序中调整暗模式的更多信息,请参阅以下博客文章。

如何在 iOS 应用中采用 iOS 13 暗模式

于 2019-11-25T11:33:10.577 回答
5

Xcode11-beta 的界面生成器中提供了几种语义系统颜色。请使用它们来支持 .light 和 .darkMode

请逐步按照基本说明进行操作。

  1. UIView - 使用界面生成器中的 systemBackgroundColor。
  2. UILabel - 使用界面生成器中的 defaulLabel 颜色。
  3. CustomView - 请使用 .xcassests 目录并创建新的颜色集,从属性检查器中为 .light 和 .darkMode添加外观选项,并为两种模式提供不同的颜色。
  4. CustomImages - 请使用 .xcassests 目录并从属性检查器中为 .light 和 .darkMode添加外观选项,并为两种模式提供不同的图像。
  5. 还有一个选项可以使用代码提供不同的颜色和不同的图像。

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        updateUIForiOS13()
    }
    
    private func isDarkMode() -> Bool{
        if #available(iOS 12.0, *) {
            let isDark = traitCollection.userInterfaceStyle == .dark ? true : false
            return isDark
        }
        return false
    }
    
于 2019-07-11T09:38:31.957 回答
1

通过使用 Swift 模块,将包含 UIColor 扩展代码的 .swift 文件包含到您的 Objective-C 代码中。它可以在Your_Target > Build Settings > Objective-C Generated Interface Header Name下找到

这将生成一个头文件“MyApp-Swift.h”

然后将 @objc 添加到包含 UIColor 扩展代码的 .swift 文件中的每个静态颜色函数,以将其公开给 Objective-C。

@objc static func color_three() -> UIColor {

    return themeConvertor(dark: "#000000", light: "#FFFFFF")

}

在您的 Objective-C .m 文件中,导入模块,然后从 UIColor 扩展引用颜色函数:

#import "MyApp-Swift.h" // swift module

- (void)awakeFromNib {

    [super awakeFromNib];

    // color

    textLabel.textColor = [UIColor color_three];

}

游乐场示例

//: A UIKit based Playground for presenting user interface

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {

    override func loadView() {

        // color_one

        let view = UIView()
        view.backgroundColor = UIColor.color_one()

        // color_two

        let label = UILabel()
        label.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
        label.text = "Hello World!"
        label.textColor = UIColor.color_two()

        view.addSubview(label)
        self.view = view

    }

}

// put this into a file called UIColor+Extensions.swift

extension UIColor {

    static func themeConvertor(dark: String, light: String) -> UIColor {

        if #available(iOS 13, *) {

            return UIColor.init { (trait) -> UIColor in

                // the color can be from your own color config struct as well.

                return trait.userInterfaceStyle == .dark ? UIColor.init(hex: dark)! : UIColor.init(hex: light)!

            }

        } else {

            return UIColor.init(hex: light)!

        }

    }

    // Color 1
    // Black & White

    @objc static func color_one() -> UIColor {

        return themeConvertor(dark: "#000000", light: "#FFFFFF")

    }

    // Color 2
    // Orange & Blue

    @objc static func color_two() -> UIColor {

        return themeConvertor(dark: "#FFA500", light: "#0000FF")

    }

    // Color from HEX

    convenience init(r: UInt8, g: UInt8, b: UInt8, alpha: CGFloat = 1.0) {

        let divider: CGFloat = 255.0

        self.init(red: CGFloat(r)/divider, green: CGFloat(g)/divider, blue: CGFloat(b)/divider, alpha: alpha)

    }

    private convenience init(rgbWithoutValidation value: Int32, alpha: CGFloat = 1.0) {

        self.init(
            r: UInt8((value & 0xFF0000) >> 16),
            g: UInt8((value & 0x00FF00) >> 8),
            b: UInt8(value & 0x0000FF),
            alpha: alpha
        )

    }

    convenience init?(rgb: Int32, alpha: CGFloat = 1.0) {

        if rgb > 0xFFFFFF || rgb < 0 {

            return nil

        }

        self.init(rgbWithoutValidation: rgb, alpha: alpha)

    }

    convenience init?(hex: String, alpha: CGFloat = 1.0) {

        var charSet = CharacterSet.whitespacesAndNewlines
        charSet.insert("#")

        let _hex = hex.trimmingCharacters(in: charSet)

        guard _hex.range(of: "^[0-9A-Fa-f]{6}$", options: .regularExpression) != nil else {

            return nil

        }

        var rgb: UInt32 = 0
        Scanner(string: _hex).scanHexInt32(&rgb)

        self.init(rgbWithoutValidation: Int32(rgb), alpha: alpha)

    }

}

// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
于 2019-10-16T00:30:51.967 回答
0

你可以试试这个方法:

对于颜色: 在此处输入图像描述

let view = UIView()
view.backdroundColor = UIColor(named: "Color")

对于图像: 在此处输入图像描述

let imageView = UIImageView()
imageView.image = UIImage(named: "Image")

从中等帖子中获得此信息

于 2020-04-20T19:51:06.027 回答