【问题标题】:Swift, SwiftUI - .getRed(&red, green: &green, blue: &blue, alpha: &alpha)Swift, SwiftUI - .getRed(&red, green: &green, blue: &blue, alpha: &alpha)
【发布时间】:2021-12-20 15:15:42
【问题描述】:

我正在关注斯坦福大学的 CS193p 开发 iOS 应用程序在线课程。

我正在尝试Assignment 6 Memorize.pdf

它说在⬇️下面使用此代码,但它总是给我白色。某处有错误吗?请帮忙。

import SwiftUI

struct RGBAColor: Codable, Equatable, Hashable {
    let red: Double
    let green: Double
    let blue: Double
    let alpha: Double
}

extension Color {
    init(rgbaColor rgba: RGBAColor) {
        self.init(.sRGB, red: rgba.red, green: rgba.green, blue: rgba.blue, opacity: rgba.alpha)
    }
}

extension RGBAColor {
    init(color: Color) {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        if let cgColor = color.cgColor {
            UIColor(cgColor: cgColor).getRed(&red, green: &green, blue: &blue, alpha: &alpha)
        }
        self.init(red: Double(red), green: Double(green), blue: Double(blue), alpha: Double(alpha))
    }
}
import SwiftUI

struct ContentView: View {
    static let rgbaColorRed = RGBAColor(color: Color.red)
    static let thisShouldBeRed = Color(rgbaColor: rgbaColorRed)
    
    var body: some View {
        Text("Hello, world!")
            .padding()
            .foregroundColor(ContentView.thisShouldBeRed) // why white here, not red???
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

【问题讨论】:

  • Color.red 似乎没有cgColor
  • @LeoDabus OP 到底在哪里传入了 0 到 255 之间的值?

标签: swift swiftui uicolor


【解决方案1】:

正如cgColor 属性的文档所说:

对于动态颜色,例如您使用 init(_:bundle:) 从资产目录加载的颜色,或者您从动态 UIKit 或 AppKit 颜色创建的颜色,此属性为 nil。

Color.red其实是动态颜色:

适合在 UI 元素中使用的上下文相关红色。

所以Color.red.cgColor 为零,导致getRed(_:green:blue:alpha:) 调用无法运行,而redgreenbluealpha 局部变量保持为0。所以你得到的颜色不是"白色”,但“透明”。

您实际上可以直接从Color 创建UIColor,而无需通过CGColor

var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
var alpha: CGFloat = 0

// note here:
UIColor(color).getRed(&red, green: &green, blue: &blue, alpha: &alpha)
self.init(red: Double(red), green: Double(green), blue: Double(blue), alpha: Double(alpha))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多