在UIKit中,我们可以使用扩展将十六进制颜色设置为几乎所有内容。 https://www.hackingwithswift.com/example-code/uicolor/how-to-convert-a-hex-color-to-a-uicolor
但是当我尝试在SwiftUI上执行此操作时,这是不可能的,看起来SwiftUI没有将UIColor作为参数。
Text(text)
.color(UIColor.init(hex: "FFF"))
错误消息:
Cannot convert value of type 'UIColor' to expected argument type 'Color?'
我什至尝试为Color
而不是UIColor
进行扩展,但我没有运气
我的颜色扩展名:
导入SwiftUI
extension Color {
init(hex: String) {
let scanner = Scanner(string: hex)
scanner.scanLocation = 0
var rgbValue: UInt64 = 0
scanner.scanHexInt64(&rgbValue)
let r = (rgbValue & 0xff0000) >> 16
let g = (rgbValue & 0xff00) >> 8
let b = rgbValue & 0xff
self.init(
red: CGFloat(r) / 0xff,
green: CGFloat(g) / 0xff,
blue: CGFloat(b) / 0xff, alpha: 1
)
}
}
错误消息:
Incorrect argument labels in call (have 'red:green:blue:alpha:', expected '_:red:green:blue:opacity:')
答案 0 :(得分:6)
这是我的解决方案游乐场。它在回退之后添加回退,并且仅依靠hexString来获得颜色和alpha。
import SwiftUI
extension Color {
init(hex string: String) {
var string: String = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
if string.hasPrefix("#") {
_ = string.removeFirst()
}
// Double the last value if incomplete hex
if !string.count.isMultiple(of: 2), let last = string.last {
string.append(last)
}
// Fix invalid values
if string.count > 8 {
string = String(string.prefix(8))
}
// Scanner creation
let scanner = Scanner(string: string)
var color: UInt64 = 0
scanner.scanHexInt64(&color)
if string.count == 2 {
let mask = 0xFF
let g = Int(color) & mask
let gray = Double(g) / 255.0
self.init(.sRGB, red: gray, green: gray, blue: gray, opacity: 1)
} else if string.count == 4 {
let mask = 0x00FF
let g = Int(color >> 8) & mask
let a = Int(color) & mask
let gray = Double(g) / 255.0
let alpha = Double(a) / 255.0
self.init(.sRGB, red: gray, green: gray, blue: gray, opacity: alpha)
} else if string.count == 6 {
let mask = 0x0000FF
let r = Int(color >> 16) & mask
let g = Int(color >> 8) & mask
let b = Int(color) & mask
let red = Double(r) / 255.0
let green = Double(g) / 255.0
let blue = Double(b) / 255.0
self.init(.sRGB, red: red, green: green, blue: blue, opacity: 1)
} else if string.count == 8 {
let mask = 0x000000FF
let r = Int(color >> 24) & mask
let g = Int(color >> 16) & mask
let b = Int(color >> 8) & mask
let a = Int(color) & mask
let red = Double(r) / 255.0
let green = Double(g) / 255.0
let blue = Double(b) / 255.0
let alpha = Double(a) / 255.0
self.init(.sRGB, red: red, green: green, blue: blue, opacity: alpha)
} else {
self.init(.sRGB, red: 1, green: 1, blue: 1, opacity: 1)
}
}
}
let gray0 = Color(hex: "3f")
let gray1 = Color(hex: "#69")
let gray2 = Color(hex: "#6911")
let gray3 = Color(hex: "fff")
let red = Color(hex: "#FF000044s")
let green = Color(hex: "#00FF00")
let blue0 = Color(hex: "0000FF")
let blue1 = Color(hex: "0000F")
为了从Color ..获取hexString,这不是公共API。 我们仍然需要依靠UIColor实现。
PS:我在下面看到了组件解决方案。但是,如果将来API更改,我的版本会更稳定。
答案 1 :(得分:1)
您快到了,您使用了错误的初始化参数:
import React, { useState } from "react";
import SpeedDial from "@material-ui/lab/SpeedDial";
import SpeedDialIcon from "@material-ui/lab/SpeedDialIcon";
import SpeedDialAction from "@material-ui/lab/SpeedDialAction";
import FileCopyIcon from "@material-ui/icons/FileCopyOutlined";
import SaveIcon from "@material-ui/icons/Save";
import PrintIcon from "@material-ui/icons/Print";
import ShareIcon from "@material-ui/icons/Share";
import DeleteIcon from "@material-ui/icons/Delete";
import { makeStyles } from "@material-ui/core/styles";
const actions = [
{ icon: <FileCopyIcon />, name: "Copy" },
{ icon: <SaveIcon />, name: "Save" },
{ icon: <PrintIcon />, name: "Print" },
{ icon: <ShareIcon />, name: "Share" },
{ icon: <DeleteIcon />, name: "Delete" }
];
const useStyles = makeStyles({
tooltip: {
fontSize: 30
}
});
function SpeedDials() {
const [open, setOpen] = useState(false);
const classes = useStyles();
function handleClose() {
setOpen(false);
}
function handleOpen() {
setOpen(true);
}
function handleClick() {
setOpen(!open);
}
return (
<SpeedDial
ariaLabel="SpeedDial example"
icon={<SpeedDialIcon />}
open={open}
direction="up"
onBlur={handleClose}
onClick={handleClick}
onClose={handleClose}
onFocus={handleOpen}
onMouseEnter={handleOpen}
onMouseLeave={handleClose}
>
{actions.map(action => (
<SpeedDialAction
key={action.name}
icon={action.icon}
tooltipTitle={action.name}
onClick={handleOpen}
TooltipClasses={classes}
/>
))}
</SpeedDial>
);
}
export default SpeedDials;
答案 2 :(得分:1)
下面另一个使用Int表示十六进制的替代方法,当然,如果愿意,可以将其更改为String。
extension Color {
init(hex: Int, alpha: Double = 1) {
let components = (
R: Double((hex >> 16) & 0xff) / 255,
G: Double((hex >> 08) & 0xff) / 255,
B: Double((hex >> 00) & 0xff) / 255
)
self.init(
.sRGB,
red: components.R,
green: components.G,
blue: components.B,
opacity: alpha
)
}
}
用法示例:
Color(hex: 0x000000)
Color(hex: 0x000000, alpha: 0.2)
答案 3 :(得分:1)
用法
UIColor.init(hex: "f2000000")
UIColor.init(hex: "#f2000000")
UIColor.init(hex: "000000")
UIColor.init(hex: "#000000")
extension UIColor {
public convenience init(hex:String) {
var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
if (cString.hasPrefix("#")) {
cString.remove(at: cString.startIndex)
}
var r: CGFloat = 0.0
var g: CGFloat = 0.0
var b: CGFloat = 0.0
var a: CGFloat = 1.0
var rgbValue:UInt64 = 0
Scanner(string: cString).scanHexInt64(&rgbValue)
if ((cString.count) == 8) {
r = CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0
g = CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0
b = CGFloat((rgbValue & 0x0000FF)) / 255.0
a = CGFloat((rgbValue & 0xFF000000) >> 24) / 255.0
}else if ((cString.count) == 6){
r = CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0
g = CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0
b = CGFloat((rgbValue & 0x0000FF)) / 255.0
a = CGFloat(1.0)
}
self.init( red: r,
green: g,
blue: b,
alpha: a
)
} }
答案 4 :(得分:1)
SwiftUI 颜色创建从十六进制(3、4、6、8 个字符)支持 #
、alpha
、web constants
和 UIColor constants
。下面的用法示例。
Swift Package iOS 14+ 包括对 Color
十六进制、随机、CSS 颜色和用户默认值的支持。
答案 5 :(得分:0)
尝试
extension Color {
init(_ hex: Int, opacity: Double = 1.0) {
let red = Double((hex & 0xff0000) >> 16) / 255.0
let green = Double((hex & 0xff00) >> 8) / 255.0
let blue = Double((hex & 0xff) >> 0) / 255.0
self.init(.sRGB, red: red, green: green, blue: blue, opacity: opacity)
}
}
答案 6 :(得分:0)
我还通过 hackingwithswift 使用了 UIColor
的解决方案。
这是 Color
的改编版本:
init?(hex: String) {
var hexSanitized = hex.trimmingCharacters(in: .whitespacesAndNewlines)
hexSanitized = hexSanitized.replacingOccurrences(of: "#", with: "")
var rgb: UInt64 = 0
var red: Double = 0.0
var green: Double = 0.0
var blue: Double = 0.0
var opacity: Double = 1.0
let length = hexSanitized.count
guard Scanner(string: hexSanitized).scanHexInt64(&rgb) else { return nil }
if length == 6 {
red = Double((rgb & 0xFF0000) >> 16) / 255.0
green = Double((rgb & 0x00FF00) >> 8) / 255.0
blue = Double(rgb & 0x0000FF) / 255.0
} else if length == 8 {
red = Double((rgb & 0xFF000000) >> 24) / 255.0
green = Double((rgb & 0x00FF0000) >> 16) / 255.0
blue = Double((rgb & 0x0000FF00) >> 8) / 255.0
opacity = Double(rgb & 0x000000FF) / 255.0
} else {
return nil
}
self.init(.sRGB, red: red, green: green, blue: blue, opacity: opacity)
}