首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:获取暗/光模式下的动态浮动值

Swift:获取暗/光模式下的动态浮动值
EN

Stack Overflow用户
提问于 2020-02-23 23:08:22
回答 2查看 266关注 0票数 0

我经常使用语义颜色在下面的方式,有动态颜色的黑暗模式和光模式。使用这种方法,当用户切换暗/光模式时,颜色也将在运行时更新:

代码语言:javascript
复制
public static var bw100: UIColor = {
    if #available(iOS 13, *) {
        return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in
            if UITraitCollection.userInterfaceStyle == .dark {
                // Return the color for Dark Mode
                return .black
            } else {
                // Return the color for Light Mode
                return .white
            }
        }
    } else {
        // Return a fallback color for iOS 12 and lower.
        return .white
    }
}()

现在,我想对一个Float值做同样的处理,比如有一个语义浮动变量。这意味着我可以为暗模式访问不同的浮点值,对于光模式,如果用户切换暗/光模式,则该值将在运行时进行调整。我找不到解决办法。

这不工作,因为它不更新运行时。该应用程序必须在暗/光模式切换后重新启动:

代码语言:javascript
复制
 public static var myFloat: Float = {
    if #available(iOS 13.0, *) {
        if UITraitCollection.current.userInterfaceStyle == .dark {
            return 0.9
        }
        else {
            return 0.1
        }
    }
    return 0.1
}()

--这也不工作(尝试了与上面的工作方法类似的方法),但是这里我得到了一个错误Initializer init(_:) requires that (UITraitCollection) -> Float conforms to BinaryInteger

代码语言:javascript
复制
public static var myFloat: Float = {
    if #available(iOS 13, *) {
        return Float { (UITraitCollection: UITraitCollection) -> Float in
            if UITraitCollection.userInterfaceStyle == .dark {
                // Return the Float for Dark Mode
                return 0.9
            } else {
                // Return the Float for Light Mode
                return 0.1
            }
        }
    } else {
        // Return a fallback for iOS 12 and lower.
        return 0.1
    }
}()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-24 10:40:47

您无法实现与UIColorFloat的工作方式相同的功能,因为UIColor有一个特殊的初始化器,直接用于更改接口样式。但是,解决方案仍然相当简单,正如前面提到的,您必须通过实现traitCollectionDidChange(_:)来听取接口样式的更改,并手动重新计算数据。

以下代码将为您实现此功能:

代码语言:javascript
复制
// ViewController.swift

var myStoredFloat: Float = 1.0 {
    willSet {
        print(newValue)
    }
}

var myComputedFloat: Float {
    let tc = UITraitCollection.current
    let mode = tc.userInterfaceStyle
    if #available(iOS 13.0, *) {
        return (mode == .light ? 1 : 0)
    }
    return 1
}

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    self.myStoredFloat = self.myComputedFloat
}

当然,如果不依赖于存储的属性,只需使用计算的属性,就可以完全摆脱存储的属性。

*感谢matt的计算属性代码。

票数 1
EN

Stack Overflow用户

发布于 2020-02-24 00:00:56

这对我来说是实时的,而且非常接近你拥有的内容:

代码语言:javascript
复制
static var myFloat : Float {
    let tc = UITraitCollection.current
    let mode = tc.userInterfaceStyle
    if #available(iOS 13.0, *) {
        return (mode == .light ? 1 : 0)
    }
    return 1
}

正如Leo指出的,您正在做的和我正在做的事情之间唯一的真正区别是,我有一个计算的属性,它在每次您获取它的值时都会被重新计算,而对于一个在初始化后从未改变的属性,您有一个定义和调用的初始化器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60367756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档