Swift UIView "Empty Image" - swift

Could someone explain me the difference between these two pictures please?
Code with preview of the UIView:
Code without the preview of the UIView:
What's the difference? And why can't I get a preview on the second code example? It only shows "empty image"....
Thanks for helping me.

This seems to be a "feature" (bug) of a Swift playground. If you don't create the view instance using a non-zero frame width and height, you will get "empty image".
This works:
let rect = UIView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
rect.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
rect.backgroundColor = .green
But this doesn't:
let rect = UIView(frame: .zero)
// also bad: let rect = UIView(frame: CGRect(x: 0, y: 0, width: 1, height: 0))
rect.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
rect.backgroundColor = .green
And remember that:
let rect = UIView()
is essentially the same as doing:
let rect = UIView(frame: .zero)
So when using a playground, create a view with a non-zero frame width and height in the initializer if you don't want to see "empty image".

Related

Draw shapes with SwiftUI

So,
I want to use the accelerated graphics engine and hence draw some shapes with CALayer / CAShaperLayer. I want a view of 100x100 with a rounded rectangle of 50x50. Mind that this is in a MacOS environment, not iOS. I have the following code that that doesn't work:
struct KeyboardView2: NSViewRepresentable {
func makeNSView(context: Context) -> NSView {
var view = NSView(frame: NSRect(x: 0, y: 0, width: 100, height: 100))
var shapeLayer = CAShapeLayer()
shapeLayer.frame = NSRect(x: 0, y: 0, width: 100, height: 100)
let path = NSBezierPath(roundedRect: NSRect(x: 0, y: 0, width: 50, height: 50), xRadius: 10, yRadius: 10)
NSColor.red.setFill()
NSColor.blue.setStroke()
path.stroke()
view.layer = CALayer()
view.layer!.frame = NSRect(x: 0, y: 0, width: 100, height: 100)
view.layer!.addSublayer(shapeLayer)
return view
}
func updateNSView(_ nsView: NSViewType, context: Context) {
}
}
Amy idea? Thanks
You have your drawing code in the makeNSView method. You want to put it in the draw method.

Why is CALayer not being added to UITextView

I have a text view and I am attempting to add a line underneath it. I am trying to accomplish this with a CALayer, however it is not showing up in the textView. I would appreciate it if someone could help me. The code is below.
let border = CALayer()
border.backgroundColor = UIColor(hexString: "#CC0000").cgColor
border.frame = CGRect(x: 0, y: messageField.frame.height - 3, width: messageField.frame.width, height: 3)
messageField.layer.addSublayer(border)
In my test app, I just tried this:
let messageField = UITextView(frame: CGRect(x: 30, y: 40, width: view.frame.width - 60, height: 40))
var border = CALayer()
border.backgroundColor = UIColor.red.cgColor
border.frame = CGRect(x: 0, y: messageField.frame.height - 3, width: messageField.frame.width, height: 3)
messageField.layer.addSublayer(border)
view.addSubview(messageField)
And it worked fine. Weird but fine. The color showed up no problem, but it scrolls along with the text view. But that might be what you want. I tried it with different heights for the message field too. I couldn't get it to not show.
If you want it to work and have the line not scroll with the text, try this answer: https://stackoverflow.com/a/38327895/793607

Swift: NSStackView, bug only one subview is added

Hello in my code below I want to add NSImageView to my stackView, but there is a bug because there is only one that is added. The loop is 3 iterations so normally I should have 3 images:
let imageView = NSImageView(frame: NSRect(x: 0, y: 0, width: 50, height: 50))
imageView.image = image.image
icons.forEach { _ in
stackImage.addArrangedSubview(imageView)
}
print(stackImage.subviews.count) // Outpout 1
Create the NSImageView instances inside the forloop.
And you need to check stackImage.arrangedSubviews.count not stackImage.subviews.count
var icons = [NSImage(named: ""),NSImage(named: ""),NSImage(named: "")]
icons.forEach { image in
let imageView = NSImageView(frame: NSRect(x: 0, y: 0, width: 50, height: 50))
imageView.image = image
stackImage.addArrangedSubview(imageView)
}
print(stackImage.arrangedSubviews.count)

Transparency when drawing in CGContext does not work Swift

Hello i'm developing a drawing application. I try to draw multiple lines with transparency in a context (one line over another) but the transparencies do not work as I thought they work when drawing one image over another. I've made this test with 2 squares:
var imageView:UIImageView = UIImageView()
imageView.frame = CGRect(x: 0, y: 0, width: 400, height: 200)
self.addSubview(imageView)
/* CREATE A SQUARE UIImage */
let color:UIColor = UIColor(red:1.00, green:0.40, blue:0.21, alpha:1.0)
let bounds:CGRect = CGRect(x: 0, y: 0, width: 200, height: 200)
UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0.0)
var ctx = UIGraphicsGetCurrentContext()
ctx?.setFillColor(color.cgColor)
ctx?.fill(bounds)
let rectangleUIImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
/* DRAW SCUARE WHIT ALPHA 1 */
UIGraphicsBeginImageContextWithOptions(imageView.frame.size, false, 0.0)
ctx = UIGraphicsGetCurrentContext()
ctx?.setAlpha(1.0)
ctx?.draw(rectangleUIImage.cgImage!, in: CGRect(x: 0, y: 0, width: 200, height: 200))
/* DRAW 10 SQUARES WHIT ALPHA 0.1 IN THE SAME PLACE */
ctx?.setAlpha(0.1)
for i in 0..<10 {
ctx?.draw(rectangleUIImage.cgImage!, in: CGRect(x: 200, y: 0, width: 200, height: 200))
}
imageView.image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
I would expect the above code to result in this:Two boxes visually with the same transparency
But no matter how many times I draw a transparent square on another I always find this :( :
Two boxes, one without transparency and one with transparency

Issue with UITextField's leftView property

I am trying to add a single blank UIView to multiple UITextField in order to give a little padding. But my app freeze (does not crash). Can anyone tell me what the issue might be? Here is my code.
var paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 50))
It works well when I assign this view to single UITextField
emailTextField.leftView = paddingView
emailTextField.leftViewMode = UITextFieldViewMode.Always
But App does not responds if I add same paddingView to another UITextField e.g
someTextField.leftView = paddingView
someTextField.leftViewMode = UITextFieldViewMode.Always
My Environment is xCode 6.4, Swift 2.0.
So, I was having and issue with the same exact problem. My solution was to create a paddingView for each textfield.
var paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 50))
var paddingView2 = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 50))
emailTextField.leftView = paddingView
emailTextField.leftViewMode = UITextFieldViewMode.Always
someTextField.leftView = paddingView2
someTextField.leftViewMode = UITextFieldViewMode.Always