Type 'NSColor' has no member 'black' - swift

I'm working with Swift and SceneKit in Xcode 9.2. I've been applying color to geometry with NSColor, but all of a sudden (gradually) most of my colors get the type NSColor has no member .colorname. Like my game compiled and ran just fine, and then on the next compile, I got an error with .cyan. I changed it to .black and it ran. Then another color got an error, and then most of the colors got an error.
Here's an example:
node.geometry?.firstMaterial?.diffuse.contents = NSColor.black
the options that I have left are:
.blue, .green, .int, .rawValue, .red, .yellow.
What happened to all the colors?
EDIT: I cleaned up the project, it all compiles without warnings but I still only have 4 colors and they all render gray. I printed out the nodes diffuse colors to console and they read correct.
I've also imported Cocoa framework.
EDIT: I FOUND MY MISTAKE.
I accidentally replaced the name of an enum with NSColor while doing a find and replace. That's why SKColor worked, because it was a new name.
I am so embarrassed.

You could use:
node.geometry?.firstMaterial?.diffuse.contents = NSColor(srgbRed: 0, green: 0, blue: 0, alpha: 1.0)
In this way you create a color with your own RGBs values, so in this way you can get the color black. The last parameter, alpha, is the value of opacity and it needs to be 100 in order to see the color

In your case the better way is to use this syntax:
NSColor(calibratedRed: 0.0, green: 0.0, blue: 0.0, alpha: 1.0)
In iOS you should use the syntax like this:
cube.firstMaterial?.diffuse.contents = UIColor(red: 0.3, green: 0.45, blue: 0.75, alpha: 1.0)
In macOS the syntax is like this:
sphere.firstMaterial?.reflective.contents = NSColor(calibratedRed: 99.0, green: 0.0, blue: 0.0, alpha: 1.0)
Remember, the alpha (aka opacity), specified as a value from 0.0-1.0. Alpha values below 0 are interpreted as 0.0, and values above 1.0 are interpreted as 1.0.
And, of course, you can specify the colorspace explicitly (like sRGB):
init(srgbRed: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)

Related

SKLightNode with flat shape

Does anyone knows what could affect the "shape" for a SKLightNode?
In a Playground project, I added 2 lights: one for the ambiant light (located of the scene) and one for a local light (located on scene) and the "shape" of the light in nice and round like here:
But adding the same code in another project, the light is having a flat shape like this:
In both cases, the light is added as part of the SKScene and I change the colour with this:
backgroundLightNode.ambientColor = NSColor(red: 1.0, green: 1.0, blue: 1.0, alpha: alpha)
lightNode.lightColor = NSColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1 - alpha)

Xcode 11 #colorLiteral written instead of being displayed as color

I recently updated my Xcode from 10.3 to 11.0.
I registered all the colors I am using among the app in a Scheme.swift file with its own struct.
Since I updated, the #colorLiterals are not computed properly by Xcode in my struct constructor but just written as code:
Xcode 11
Raw code, so you can copy/paste it in a playground
import UIKit
struct Theme {
var color1: UIColor
var color2: UIColor
}
Theme(color1: #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0),
color2: #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))
Does anyone know how I can force Xcode to refresh or compute these colorLiterals so I can use the color picker as usual?
Is it not possible anymore to define a colorLiteral in a function call (here a struct init)?
Edit
It seems to be related to the fact that my #colorLiterals are written in a function call, before a ,. If I surround it by parenthesis it automatically switch to a "color picker".
Plus, it doesn't happen to the last colorLiteral in the call

Fill Quartz 2D line with custom Texture instead of UIColor

So instead of this:
context?.setStrokeColor(red: red, green: green, blue: blue, alpha: 1.0)
I want to be able to fill / add a texture to those drawed lines.
I found out that you could use CGPatternCreate in Objective-C for this.
Does this apply to Swift as well and if so how can I do this?
Thanks

Getting hue from UIColor yields wrong result

I'm doing the following in order to retrieve the hue from a UIColor():
let rgbColour = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
var hue: CGFloat = 0
var saturation: CGFloat = 0
var brightness: CGFloat = 0
var alpha: CGFloat = 0
rgbColour.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
println("\(hue),\(saturation),\(brightness)")
Output:
1.0,1.0,1.0
According to this link, I'm meant to be getting 0.0,1.0,1.0 for RGB (red) 1.0,0.0,0.0.
Am I doing something wrong?
First of all the range of the red/green/blue components in UIColor is 0.0 .. 1.0,
not 0.0 .. 255.0, so you probably want
let rgbColour = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
But even then you get the output 1.0,1.0,1.0 and this is correct.
The hue component ranges from 0.0 to 1.0, which corresponds to the angle from 0º to 360º
in a color wheel (see for example HSL and HSV).
Therefore hue = 0.0 and hue = 1.0 describe an identical color.
If you need to normalize the hue component to the half-open interval
0.0 <= hue < 1.0 then you could do that with
hue = fmod(hue, 1.0)
To build on #Martin R's answer:
If you wanted to use HSB, you need to:
Divide the hue value by 360
Use decimals for the Saturation and Brightness values
So, say for example that Sketch is telling you the colour values in HSB are: Hue: 20, Saturation: 72 and Brightness: 96
In Xcode, create the colour as follows:
let myAwesomeColour = UIColor(hue: 20/360, saturation: 0.72, brightness: 0.96, alpha: 1.0)
Whether you use RGB or HSB is a matter of preference. The results are the same as far as Xcode is concerned, they both translate to a UIColor.

How to update SKLabelNode color after the node is initiated?

I have SKLabelNode in my Swift-code. I need to change the Label's color during SKAction. Simply:
override func didMoveToView(view: SKView) {
...
var color = UIColor(red: CGFloat(1.0), green: CGFloat(0.0), blue: CGFloat(0.0), alpha: CGFloat(0.0))
myLabel.fontColor = color
...
}
Doesn't work. I still have to somehow update the node but how? I'm noobie to Swift and Sprite Kit.
Do you need it to be in an SKAction? If not, simply use this:
myLabel.fontColor = SKColor.blueColor()
Substitute blueColor with whichever color you want, or use the generic method where 'float here' is a fraction of 255 (such as 50.0f/255.0f).
myLabel.fontColor = SKColor(red: floatHere, green: floatHere, blue: floatHere, alpha: floatFrom0To1Here)
In case you do need to set the color through an SKAction, you can use this method:
myLabel.runAction(SKAction.colorizeWithColor(UIColor.blueColor(), colorBlendFactor: 1, duration: 1))
I had a similar problem a few weeks ago.
Try changing your color variable to the following:
var color = UIColor(red: 1.0 / 255, green: 0.0 / 255, blue: 0.0 / 255, alpha: 0.0)