Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to code NSButton to look just like image

Using code (not the Interface builder) I need to create an NSButton that looks like an image. Specifically I want to use NSImageNameStopProgressFreestandingTemplate and I need it not to look like button but to look like the image. This means:
1. No 'button down' look
2. No border, no any visibility of the button

Thanks.

like image 636
OZG Avatar asked Dec 26 '10 12:12

OZG


3 Answers

I know this response is a bit late, but you could try this, given thisButton:

[thisButton setImage:[NSImage imageNamed:NSImageNameStopProgressFreestandingTemplate]];
[thisButton setImagePosition:NSImageOnly];
[thisButton setBordered:NO];

That last line is the key bit: removing the button border effectively strips it of its bezel, leaving only the image to click on. (BTW, I haven't tried the above code specifically, so you may need to throw in a couple of other tweaks, such as setting the imageScaling or buttonType, to get it to work best.)

One final note: If you're using a template image (as you said you would), Cocoa will automatically display it with a slight dark-grey gradient; when the button is clicked, it will momentarily darken to solid black. This is an automatic "'button down' look" you didn't want; however, it is very subtle, and is a good indicator that the button worked. If you don't want this to happen, you could get an instance of the desired image and [stopImage setTemplate:NO]; on it.

like image 59
Taldar Avatar answered Oct 03 '22 14:10

Taldar


Disable isBordered

let button = NSButton(
  image: NSImage(named: NSImage.Name("plus"))!,
  target: self,
  action: #selector(onButtonPress)
)

button.isBordered = false
like image 30
onmyway133 Avatar answered Oct 03 '22 13:10

onmyway133


If you don't want to use a templated but want the push down highlight anyways, you can also use the following setup for an NSButton:

let imageButton = NSButton()
imageButton.image = NSImage(named: "MyImage")!
imageButton.bezelStyle = .shadowlessSquare
imageButton.isBordered = false
imageButton.imagePosition = .imageOnly

The important thing to make the highlight work on any image is to set bezelStyle to shadowlessSquare.

I know this behavior wasn't requested in the question, but it might be useful for others.

like image 28
Codey Avatar answered Oct 03 '22 13:10

Codey