Fill Quartz 2D line with custom Texture instead of UIColor - swift

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

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

How do you fade the bottom of an image into the background? [duplicate]

I've read examples around here but I cannot do it the way I desire, somehow my gradient examples are stuck on the middle of the screen, not working as expected.
I have a UICollectionView which fills the whole screen with vertical scroll.
I want the top and bottom of the UICollectionView to be black and the middle to be transparent (since I'm using a black blackgroundColor).
I tried to apply gradients, but somehow I'm failing to accomplish what I want.
Here's my code:
let gradient = CAGradientLayer()
gradient.frame = view.bounds
gradient.colors = [UIColor.black.cgColor, UIColor.clear.cgColor, UIColor.black.cgColor]
gradient.startPoint = CGPoint(x: 1, y: 0)
gradient.endPoint = CGPoint(x: 1, y: 1)
view.layer.mask = gradient
The code above is placing the gradient in the middle of the screen but inverted. It is transparent on top and bottom of the screen and the middle section if fading to complete black.
I'm trying to create something like this:
Thanks for helping
You can achieve that by changing your color line with this:
gradient.colors = [
UIColor(white: 1.0, alpha: 0).cgColor,
UIColor(white: 1.0, alpha: 1).cgColor,
UIColor(white: 1.0, alpha: 0).cgColor
]
Or if you want to have even more control over your gradient, you can also use the code below and play around with the location and/or color alpha values:
let gradient = CAGradientLayer()
gradient.frame = view.bounds
gradient.colors = [
UIColor(white: 1, alpha: 0).cgColor,
UIColor(white: 1, alpha: 1).cgColor,
UIColor(white: 1, alpha: 1).cgColor,
UIColor(white: 1, alpha: 0).cgColor
]
gradient.locations = [0, 0.4, 0.6, 1]
view.layer.mask = gradient
Reason of this from the documentation;
An optional layer whose alpha channel is used to mask the layer’s content.
The layer’s alpha channel determines how much of the layer’s content and background shows through. Fully or partially opaque pixels allow the underlying content to show through but fully transparent pixels block that content.

Type 'NSColor' has no member 'black'

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)

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)