我们如何在当前使用iOS 13的iOS应用中支持暗模式?

时间:2019-06-20 05:17:14

标签: ios iphone ios13 ios-darkmode

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

4 个答案:

答案 0 :(得分:5)

这是添加颜色逻辑的代码,应在黑暗模式下显示。

if self.traitCollection.userInterfaceStyle == .dark {

  //Add your Dark mode colors here
 } else {

  //Your normal colors should appear here
 }

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

How to Adopt iOS 13 Dark Mode in your iOS App

答案 1 :(得分:1)

Hi Pushp, 

There are couples of semantic system color are available in interface builder of Xcode11-beta. please use those to support both .light and .darkMode

Please follow the basics instructions step by step.

1) UIView - use systemBackgroundColor from interface builder.
2) UILabel - use defaulLabel color from interface builder.
3) CustomView - Please use .xcassests catalog and create **new color set**, add **appearances** option from **attributes inspector** for .light and .darkMode and provide different color for both mode.
4) CustomImages - Please use .xcassests catalog and add **appearances** option from **attributes inspector** for .light and .darkMode and provide different images for both mode.
5) There is also an option to provide different color and different images using code. 

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
    }

答案 2 :(得分:0)

通过使用Swift模块,将包含UIColor扩展代码的.swift文件包含在Objective-C代码中。可以在您的目标> 构建设置> Objective-C生成的接口标题名称

下找到

这将生成头文件“ 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()

答案 3 :(得分:0)

您可以尝试以下方法:

对于颜色: enter image description here

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

对于图像: enter image description here

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

medium post

获得了此信息