【问题标题】:Strange Behavior Of UIColor As Function Parameter In SwiftUIColor作为Swift中的函数参数的奇怪行为
【发布时间】:2015-07-15 17:06:08
【问题描述】:

我创建了一个具有可变数量参数的函数。这是我的功能:

func setColors(colors: UIColor...) {
    self.Colors = colors
}

现在当我向它传递一些值时:

setColors(UIColor.blackColor(), UIColor.redColor())

函数中的黑色将变为白色。这种事情只发生在黑色上,其他颜色都可以。

这个东西在一个类中用来生成渐变:

var Colors: [UIColor] = []

func setColors(colors: UIColor...) {
    self.Colors = colors
}

override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()

    let colorSpace: CGColorSpaceRef = CGColorSpaceCreateDeviceRGB()

    var colorComponent: [CGFloat] = []
    var colorLocations: [CGFloat] = []
    var i: CGFloat = 0.0;

    for color in Colors {
        let c = CGColorGetComponents(color.CGColor)
        colorComponent.append(c[0])
        colorComponent.append(c[1])
        colorComponent.append(c[2])
        colorComponent.append(c[3])
        colorLocations.append(i)
        i += CGFloat(1.0) / CGFloat(self.Colors.count)
    }

    let gradient: CGGradientRef = CGGradientCreateWithColorComponents(colorSpace, colorComponent, colorLocations, self.Colors.count)

    CGContextDrawLinearGradient(context, gradient, CGPoint(x: 0.0, y: self.frame.size.height / 2), CGPoint(x: self.frame.size.width, y: self.frame.size.height / 2), 0)
}

【问题讨论】:

  • 不是这样。你只是误读了输出。
  • @matt 不,我正在使用此函数在核心图形中创建渐变。结果是白色
  • 我对此表示怀疑。您不能从 UIColor 创建渐变。您在其他地方的代码出错了,因为您没有从该颜色正确派生 CGColor。所以你的问题在别处。但是我(正确地)回答了您实际提出的问题。如果您问错了问题,请提出不同的问题。
  • 我在渐变中使用color.CGColor。正如我所说,渐变很好,但黑色在结果中显示为白色。
  • 但是您没有显示该代码,所以我不相信您做对了。您可能错误地配置了渐变。我没有办法知道。我只知道你告诉我的。从你告诉我的来看,这只是误读输出的问题。你没有问任何渐变。您声称黑色将是白色在此函数中。我证明你错了。就这样结束了。我运行了你的代码。我得到了正确答案。完成。

标签: swift function parameter-passing uicolor


【解决方案1】:

问题是你使用CGColorGetComponents错了:

let c = CGColorGetComponents(color.CGColor)
colorComponent.append(c[0])
colorComponent.append(c[1])
colorComponent.append(c[2])
colorComponent.append(c[3])

你在这里做了一个错误的假设。

该代码发生可以工作如果这个颜色在 UIDeviceRGBColorSpace 中,它有四个组件。

但如果 UIDeviceWhiteColorSpace 中只有 两个 组件且黑色 中的 UIDeviceWhiteColorSpace 中的这种颜色,它确实 工作。

【讨论】:

  • 不,你没有。您有一个 rgb colorSpace 变量,但直到 您错误地提取了组件之后才使用它。到那时,为时已晚 - 你有错误的组件。您需要响应实际颜色的 actual 颜色空间。还有一个函数可以告诉你它到底有多少组件。
  • 我不知道你想做什么。你的代码对我来说毫无意义。你为什么要提取组件?只需致电CGGradientCreateWithColors,一切就绪。
  • 我想创建一个渐变。我该怎么办?
  • 我不会为你写代码。我回答了你(再次)提出的问题。阅读我所说的。阅读我链接到的另一个答案。阅读我的cmets。阅读文档!
【解决方案2】:

你可以试试这样的:

var colors: [UIColor] = []

func setColors(colors: UIColor...) {
    self.colors = colors
}

override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()
    let colorSpace: CGColorSpaceRef = CGColorSpaceCreateDeviceRGB()

    var gradientColors: [CGColor] = []
    var colorLocations: [CGFloat] = []
    var i: CGFloat = 0.0;

    for color in colors {
        gradientColors.append(color.CGColor)
        colorLocations.append(i)
        i += CGFloat(1.0) / CGFloat(colors.count)
    }

    let gradient: CGGradientRef = CGGradientCreateWithColors(colorSpace, gradientColors, colorLocations)

    CGContextDrawLinearGradient(context, gradient, CGPoint(x: 0.0, y: self.frame.size.height / 2), CGPoint(x: self.frame.size.width, y: self.frame.size.height / 2), 0)
}

旁注:您不想将变量名大写。于是我把self.Colors改成了self.colors

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多