How do I set UIButton background color forState: UIControlState.Highlighted in Swift
I can set the background color for a button but I can't work out how to set the background color for UIControlState.Highlighted
. Is it even possible? or do I need to go down the setBackgroundImage
path?
ios swift uibutton xcode6
add a comment |
I can set the background color for a button but I can't work out how to set the background color for UIControlState.Highlighted
. Is it even possible? or do I need to go down the setBackgroundImage
path?
ios swift uibutton xcode6
Check this post somethingaboutios.wordpress.com/2016/02/09/… Swift example at the end of the post.
– Gabriel.Massana
Feb 9 '16 at 21:03
add a comment |
I can set the background color for a button but I can't work out how to set the background color for UIControlState.Highlighted
. Is it even possible? or do I need to go down the setBackgroundImage
path?
ios swift uibutton xcode6
I can set the background color for a button but I can't work out how to set the background color for UIControlState.Highlighted
. Is it even possible? or do I need to go down the setBackgroundImage
path?
ios swift uibutton xcode6
ios swift uibutton xcode6
edited Jun 2 '15 at 19:29
winterized
2,55631420
2,55631420
asked Oct 28 '14 at 4:37
David WoodDavid Wood
6042713
6042713
Check this post somethingaboutios.wordpress.com/2016/02/09/… Swift example at the end of the post.
– Gabriel.Massana
Feb 9 '16 at 21:03
add a comment |
Check this post somethingaboutios.wordpress.com/2016/02/09/… Swift example at the end of the post.
– Gabriel.Massana
Feb 9 '16 at 21:03
Check this post somethingaboutios.wordpress.com/2016/02/09/… Swift example at the end of the post.
– Gabriel.Massana
Feb 9 '16 at 21:03
Check this post somethingaboutios.wordpress.com/2016/02/09/… Swift example at the end of the post.
– Gabriel.Massana
Feb 9 '16 at 21:03
add a comment |
9 Answers
9
active
oldest
votes
If anyone stops by, another way to go maybe more easily if it is something you need more than once... I wrote a short extension for UIButton, it works just fine:
for Swift 3
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), color.CGColor)
CGContextFillRect(UIGraphicsGetCurrentContext(), CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, forState: forState)
}
}
for Swift 4
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControl.State) {
self.clipsToBounds = true // add this to maintain corner radius
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
if let context = UIGraphicsGetCurrentContext() {
context.setFillColor(color.cgColor)
context.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}
}
}
You use it just like setBackgroundImage
:
yourButton.setBackgroundColor(UIColor.whiteColor(), forState: UIControlState.Highlighted)
9
This will destroy auto layout and remove corner radius.
– user4788711
Jun 17 '15 at 17:08
1
@ user4788711 just as setting a background image would. Not more, not less.
– winterized
Jun 23 '15 at 15:42
1
works perfectly!
– CularBytes
Jul 16 '15 at 15:18
11
in order to fix corner radius you just need to enable Clip subviews on button
– heximal
Sep 12 '15 at 20:58
2
For me, it was totally worth it to extend UIImage with an initializer for the color part. Then this function's body becomes simplyself.setBackgroundImage(UIImage(color: color), forState: forState)
– Phlippie Bosman
Sep 5 '17 at 9:44
|
show 7 more comments
Syntax changes to @winterized extension for Swift 3+ syntax
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}}
add a comment |
Below will be one way to go. Two IBActions. One to control background color when depressing a button, one on release.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
@IBAction func buttonClicked(sender: AnyObject) { //Touch Up Inside action
button.backgroundColor = UIColor.whiteColor()
}
@IBAction func buttonReleased(sender: AnyObject) { //Touch Down action
button.backgroundColor = UIColor.blueColor()
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
When you look at the autocomplete options for your button after adding a period, you can set a background color, but not for specified state. You can only set background images. Now of course if you are married to doing it this way instead of using the method I show above, you could load an image of the desired color as the background image using the setbackgroundImageForState property.
That's going to work perfectly! Thanks!
– David Wood
Oct 28 '14 at 8:30
1
That solution works only in a ViewController but not in a TableViewController. The touched down action works also in TVC but only with some miliseconds delay, sothat a fast touch on screen won't change color of button. I think there's somewhere a problem with the cell in which the button is, but i'm not sure.
– S. Birklin
Jun 11 '15 at 11:44
I ran exactly in the same problem. If I only tap the view than nothing happens because the color is already back to the old color. I could fix this problem with a little delay so that the color is switched back some milliseconds later. So the color is visible even if the user only taps shortly.
– Philipp Otto
Aug 19 '15 at 15:49
Also, I think the "Touch Down" method is risky. First, it doesn't reset the color automatically. That's easy enough, on "Touch-up Inside" just set it back to the original color. But what if the user does something abnormal, like pushes down, then decides not to continue, and drags their finger off. The color won't reset.
– Dave G
Jan 2 '16 at 22:56
add a comment |
Swift 4 Version of this solution:
extension UIButton {
func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
setBackgroundImage(colorImage, for: state)
}
}
2
Just a small improvement to the code, to avoid force-unwraps try doing this:if let currentGraphicsContext = UIGraphicsGetCurrentContext() { currentGraphicsContext.setFillColor(color.cgColor) currentGraphicsContext.fill(CGRect(x: 0, y: 0, width: 1, height: 1)) }
Plus addinglayer.masksToBounds = true
to keep the functionality oflayer.cornerRadius
– T. Hyldgaard
Jan 24 '18 at 13:41
add a comment |
Update Swift 4
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}
Event
Button Action
Show Touch On Hightlight
add a comment |
Seems nobody here has mentioned using Key Value Observation yet, but it's another approach.
A reason for doing so instead of picking the other answers here is you don't need to go creating new images all the time nor be concerned with secondary effects of assigning images to buttons (e.g. cornerRadius effects).
But you'll need to create a class for the observer, who would be responsible for storing the different background colours and applying them in the observeValue()
method.
public class ButtonHighlighterObserver: NSObject {
var observedButton:UIButton? = nil
var backgroundColor: UIColor = UIColor.white
var backgroundHighlightColor: UIColor = UIColor.gray
public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
// Perform background color changes when highlight state change is observed
if keyPath == "highlighted", object as? UIButton === observedButton {
observedButton!.backgroundColor = observedButton!.isHighlighted ? self.backgroundHighlightColor : self.backgroundColor
}
}
}
Then all you need to do is manage addObserver / removeObserver during operation:
// Add observer to button's highlighted value
button.addObserver(anObserver, forKeyPath: "highlighted", options: [.new], context: nil)
anObserver.observedButton = button
// ...
// And at deinit time, be sure you remove the observer again
anObserver.observedButton?.removeObserver(item, forKeyPath: "highlighted")
anObserver.observedButton = nil
add a comment |
Can we do the same using run time attributes?
@IBInspectable var HighlightedBackground: Bool {
get {
return true
}
set {
layer.backgroundColor = Common.sharedInstance.OrangeColor.CGColor
print("highlighted state")
}
}
add a comment |
Why not?
@implementation UIButton (Color)
- (void) setBackgroundColor:(UIColor*)color forState:(UIControlState)state
{
[self setBackgroundImage:[UIImage.alloc initWithCIImage:[CIImage imageWithColor:[CIColor colorWithCGColor:color.CGColor]]] forState:state];
}
@end
add a comment |
Swift 4+ compatibility for the accepted answer :
extension UIButton {
/// Sets the background color to use for the specified button state.
func setBackgroundColor(color: UIColor, forState: UIControlState) {
let minimumSize: CGSize = CGSize(width: 1.0, height: 1.0)
UIGraphicsBeginImageContext(minimumSize)
if let context = UIGraphicsGetCurrentContext() {
context.setFillColor(color.cgColor)
context.fill(CGRect(origin: .zero, size: minimumSize))
}
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.clipsToBounds = true
self.setBackgroundImage(colorImage, for: forState)
}
}
Compatible SwiftLint and fix the bug of broken auto layout / corner radius.
Or you can change your button type tosystem
instead ofcustom
– Maximelc
Sep 19 '18 at 12:12
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f26600980%2fhow-do-i-set-uibutton-background-color-forstate-uicontrolstate-highlighted-in-s%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
9 Answers
9
active
oldest
votes
9 Answers
9
active
oldest
votes
active
oldest
votes
active
oldest
votes
If anyone stops by, another way to go maybe more easily if it is something you need more than once... I wrote a short extension for UIButton, it works just fine:
for Swift 3
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), color.CGColor)
CGContextFillRect(UIGraphicsGetCurrentContext(), CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, forState: forState)
}
}
for Swift 4
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControl.State) {
self.clipsToBounds = true // add this to maintain corner radius
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
if let context = UIGraphicsGetCurrentContext() {
context.setFillColor(color.cgColor)
context.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}
}
}
You use it just like setBackgroundImage
:
yourButton.setBackgroundColor(UIColor.whiteColor(), forState: UIControlState.Highlighted)
9
This will destroy auto layout and remove corner radius.
– user4788711
Jun 17 '15 at 17:08
1
@ user4788711 just as setting a background image would. Not more, not less.
– winterized
Jun 23 '15 at 15:42
1
works perfectly!
– CularBytes
Jul 16 '15 at 15:18
11
in order to fix corner radius you just need to enable Clip subviews on button
– heximal
Sep 12 '15 at 20:58
2
For me, it was totally worth it to extend UIImage with an initializer for the color part. Then this function's body becomes simplyself.setBackgroundImage(UIImage(color: color), forState: forState)
– Phlippie Bosman
Sep 5 '17 at 9:44
|
show 7 more comments
If anyone stops by, another way to go maybe more easily if it is something you need more than once... I wrote a short extension for UIButton, it works just fine:
for Swift 3
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), color.CGColor)
CGContextFillRect(UIGraphicsGetCurrentContext(), CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, forState: forState)
}
}
for Swift 4
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControl.State) {
self.clipsToBounds = true // add this to maintain corner radius
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
if let context = UIGraphicsGetCurrentContext() {
context.setFillColor(color.cgColor)
context.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}
}
}
You use it just like setBackgroundImage
:
yourButton.setBackgroundColor(UIColor.whiteColor(), forState: UIControlState.Highlighted)
9
This will destroy auto layout and remove corner radius.
– user4788711
Jun 17 '15 at 17:08
1
@ user4788711 just as setting a background image would. Not more, not less.
– winterized
Jun 23 '15 at 15:42
1
works perfectly!
– CularBytes
Jul 16 '15 at 15:18
11
in order to fix corner radius you just need to enable Clip subviews on button
– heximal
Sep 12 '15 at 20:58
2
For me, it was totally worth it to extend UIImage with an initializer for the color part. Then this function's body becomes simplyself.setBackgroundImage(UIImage(color: color), forState: forState)
– Phlippie Bosman
Sep 5 '17 at 9:44
|
show 7 more comments
If anyone stops by, another way to go maybe more easily if it is something you need more than once... I wrote a short extension for UIButton, it works just fine:
for Swift 3
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), color.CGColor)
CGContextFillRect(UIGraphicsGetCurrentContext(), CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, forState: forState)
}
}
for Swift 4
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControl.State) {
self.clipsToBounds = true // add this to maintain corner radius
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
if let context = UIGraphicsGetCurrentContext() {
context.setFillColor(color.cgColor)
context.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}
}
}
You use it just like setBackgroundImage
:
yourButton.setBackgroundColor(UIColor.whiteColor(), forState: UIControlState.Highlighted)
If anyone stops by, another way to go maybe more easily if it is something you need more than once... I wrote a short extension for UIButton, it works just fine:
for Swift 3
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), color.CGColor)
CGContextFillRect(UIGraphicsGetCurrentContext(), CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, forState: forState)
}
}
for Swift 4
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControl.State) {
self.clipsToBounds = true // add this to maintain corner radius
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
if let context = UIGraphicsGetCurrentContext() {
context.setFillColor(color.cgColor)
context.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}
}
}
You use it just like setBackgroundImage
:
yourButton.setBackgroundColor(UIColor.whiteColor(), forState: UIControlState.Highlighted)
edited Nov 19 '18 at 20:12
Quinn
40612
40612
answered Jun 2 '15 at 19:13
winterizedwinterized
2,55631420
2,55631420
9
This will destroy auto layout and remove corner radius.
– user4788711
Jun 17 '15 at 17:08
1
@ user4788711 just as setting a background image would. Not more, not less.
– winterized
Jun 23 '15 at 15:42
1
works perfectly!
– CularBytes
Jul 16 '15 at 15:18
11
in order to fix corner radius you just need to enable Clip subviews on button
– heximal
Sep 12 '15 at 20:58
2
For me, it was totally worth it to extend UIImage with an initializer for the color part. Then this function's body becomes simplyself.setBackgroundImage(UIImage(color: color), forState: forState)
– Phlippie Bosman
Sep 5 '17 at 9:44
|
show 7 more comments
9
This will destroy auto layout and remove corner radius.
– user4788711
Jun 17 '15 at 17:08
1
@ user4788711 just as setting a background image would. Not more, not less.
– winterized
Jun 23 '15 at 15:42
1
works perfectly!
– CularBytes
Jul 16 '15 at 15:18
11
in order to fix corner radius you just need to enable Clip subviews on button
– heximal
Sep 12 '15 at 20:58
2
For me, it was totally worth it to extend UIImage with an initializer for the color part. Then this function's body becomes simplyself.setBackgroundImage(UIImage(color: color), forState: forState)
– Phlippie Bosman
Sep 5 '17 at 9:44
9
9
This will destroy auto layout and remove corner radius.
– user4788711
Jun 17 '15 at 17:08
This will destroy auto layout and remove corner radius.
– user4788711
Jun 17 '15 at 17:08
1
1
@ user4788711 just as setting a background image would. Not more, not less.
– winterized
Jun 23 '15 at 15:42
@ user4788711 just as setting a background image would. Not more, not less.
– winterized
Jun 23 '15 at 15:42
1
1
works perfectly!
– CularBytes
Jul 16 '15 at 15:18
works perfectly!
– CularBytes
Jul 16 '15 at 15:18
11
11
in order to fix corner radius you just need to enable Clip subviews on button
– heximal
Sep 12 '15 at 20:58
in order to fix corner radius you just need to enable Clip subviews on button
– heximal
Sep 12 '15 at 20:58
2
2
For me, it was totally worth it to extend UIImage with an initializer for the color part. Then this function's body becomes simply
self.setBackgroundImage(UIImage(color: color), forState: forState)
– Phlippie Bosman
Sep 5 '17 at 9:44
For me, it was totally worth it to extend UIImage with an initializer for the color part. Then this function's body becomes simply
self.setBackgroundImage(UIImage(color: color), forState: forState)
– Phlippie Bosman
Sep 5 '17 at 9:44
|
show 7 more comments
Syntax changes to @winterized extension for Swift 3+ syntax
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}}
add a comment |
Syntax changes to @winterized extension for Swift 3+ syntax
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}}
add a comment |
Syntax changes to @winterized extension for Swift 3+ syntax
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}}
Syntax changes to @winterized extension for Swift 3+ syntax
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}}
edited Jan 30 '18 at 4:36
answered Oct 5 '16 at 8:15
MaverickMaverick
1,75411629
1,75411629
add a comment |
add a comment |
Below will be one way to go. Two IBActions. One to control background color when depressing a button, one on release.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
@IBAction func buttonClicked(sender: AnyObject) { //Touch Up Inside action
button.backgroundColor = UIColor.whiteColor()
}
@IBAction func buttonReleased(sender: AnyObject) { //Touch Down action
button.backgroundColor = UIColor.blueColor()
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
When you look at the autocomplete options for your button after adding a period, you can set a background color, but not for specified state. You can only set background images. Now of course if you are married to doing it this way instead of using the method I show above, you could load an image of the desired color as the background image using the setbackgroundImageForState property.
That's going to work perfectly! Thanks!
– David Wood
Oct 28 '14 at 8:30
1
That solution works only in a ViewController but not in a TableViewController. The touched down action works also in TVC but only with some miliseconds delay, sothat a fast touch on screen won't change color of button. I think there's somewhere a problem with the cell in which the button is, but i'm not sure.
– S. Birklin
Jun 11 '15 at 11:44
I ran exactly in the same problem. If I only tap the view than nothing happens because the color is already back to the old color. I could fix this problem with a little delay so that the color is switched back some milliseconds later. So the color is visible even if the user only taps shortly.
– Philipp Otto
Aug 19 '15 at 15:49
Also, I think the "Touch Down" method is risky. First, it doesn't reset the color automatically. That's easy enough, on "Touch-up Inside" just set it back to the original color. But what if the user does something abnormal, like pushes down, then decides not to continue, and drags their finger off. The color won't reset.
– Dave G
Jan 2 '16 at 22:56
add a comment |
Below will be one way to go. Two IBActions. One to control background color when depressing a button, one on release.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
@IBAction func buttonClicked(sender: AnyObject) { //Touch Up Inside action
button.backgroundColor = UIColor.whiteColor()
}
@IBAction func buttonReleased(sender: AnyObject) { //Touch Down action
button.backgroundColor = UIColor.blueColor()
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
When you look at the autocomplete options for your button after adding a period, you can set a background color, but not for specified state. You can only set background images. Now of course if you are married to doing it this way instead of using the method I show above, you could load an image of the desired color as the background image using the setbackgroundImageForState property.
That's going to work perfectly! Thanks!
– David Wood
Oct 28 '14 at 8:30
1
That solution works only in a ViewController but not in a TableViewController. The touched down action works also in TVC but only with some miliseconds delay, sothat a fast touch on screen won't change color of button. I think there's somewhere a problem with the cell in which the button is, but i'm not sure.
– S. Birklin
Jun 11 '15 at 11:44
I ran exactly in the same problem. If I only tap the view than nothing happens because the color is already back to the old color. I could fix this problem with a little delay so that the color is switched back some milliseconds later. So the color is visible even if the user only taps shortly.
– Philipp Otto
Aug 19 '15 at 15:49
Also, I think the "Touch Down" method is risky. First, it doesn't reset the color automatically. That's easy enough, on "Touch-up Inside" just set it back to the original color. But what if the user does something abnormal, like pushes down, then decides not to continue, and drags their finger off. The color won't reset.
– Dave G
Jan 2 '16 at 22:56
add a comment |
Below will be one way to go. Two IBActions. One to control background color when depressing a button, one on release.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
@IBAction func buttonClicked(sender: AnyObject) { //Touch Up Inside action
button.backgroundColor = UIColor.whiteColor()
}
@IBAction func buttonReleased(sender: AnyObject) { //Touch Down action
button.backgroundColor = UIColor.blueColor()
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
When you look at the autocomplete options for your button after adding a period, you can set a background color, but not for specified state. You can only set background images. Now of course if you are married to doing it this way instead of using the method I show above, you could load an image of the desired color as the background image using the setbackgroundImageForState property.
Below will be one way to go. Two IBActions. One to control background color when depressing a button, one on release.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
@IBAction func buttonClicked(sender: AnyObject) { //Touch Up Inside action
button.backgroundColor = UIColor.whiteColor()
}
@IBAction func buttonReleased(sender: AnyObject) { //Touch Down action
button.backgroundColor = UIColor.blueColor()
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
When you look at the autocomplete options for your button after adding a period, you can set a background color, but not for specified state. You can only set background images. Now of course if you are married to doing it this way instead of using the method I show above, you could load an image of the desired color as the background image using the setbackgroundImageForState property.
edited Oct 28 '14 at 5:26
answered Oct 28 '14 at 5:17
Steve RosenbergSteve Rosenberg
14.9k63949
14.9k63949
That's going to work perfectly! Thanks!
– David Wood
Oct 28 '14 at 8:30
1
That solution works only in a ViewController but not in a TableViewController. The touched down action works also in TVC but only with some miliseconds delay, sothat a fast touch on screen won't change color of button. I think there's somewhere a problem with the cell in which the button is, but i'm not sure.
– S. Birklin
Jun 11 '15 at 11:44
I ran exactly in the same problem. If I only tap the view than nothing happens because the color is already back to the old color. I could fix this problem with a little delay so that the color is switched back some milliseconds later. So the color is visible even if the user only taps shortly.
– Philipp Otto
Aug 19 '15 at 15:49
Also, I think the "Touch Down" method is risky. First, it doesn't reset the color automatically. That's easy enough, on "Touch-up Inside" just set it back to the original color. But what if the user does something abnormal, like pushes down, then decides not to continue, and drags their finger off. The color won't reset.
– Dave G
Jan 2 '16 at 22:56
add a comment |
That's going to work perfectly! Thanks!
– David Wood
Oct 28 '14 at 8:30
1
That solution works only in a ViewController but not in a TableViewController. The touched down action works also in TVC but only with some miliseconds delay, sothat a fast touch on screen won't change color of button. I think there's somewhere a problem with the cell in which the button is, but i'm not sure.
– S. Birklin
Jun 11 '15 at 11:44
I ran exactly in the same problem. If I only tap the view than nothing happens because the color is already back to the old color. I could fix this problem with a little delay so that the color is switched back some milliseconds later. So the color is visible even if the user only taps shortly.
– Philipp Otto
Aug 19 '15 at 15:49
Also, I think the "Touch Down" method is risky. First, it doesn't reset the color automatically. That's easy enough, on "Touch-up Inside" just set it back to the original color. But what if the user does something abnormal, like pushes down, then decides not to continue, and drags their finger off. The color won't reset.
– Dave G
Jan 2 '16 at 22:56
That's going to work perfectly! Thanks!
– David Wood
Oct 28 '14 at 8:30
That's going to work perfectly! Thanks!
– David Wood
Oct 28 '14 at 8:30
1
1
That solution works only in a ViewController but not in a TableViewController. The touched down action works also in TVC but only with some miliseconds delay, sothat a fast touch on screen won't change color of button. I think there's somewhere a problem with the cell in which the button is, but i'm not sure.
– S. Birklin
Jun 11 '15 at 11:44
That solution works only in a ViewController but not in a TableViewController. The touched down action works also in TVC but only with some miliseconds delay, sothat a fast touch on screen won't change color of button. I think there's somewhere a problem with the cell in which the button is, but i'm not sure.
– S. Birklin
Jun 11 '15 at 11:44
I ran exactly in the same problem. If I only tap the view than nothing happens because the color is already back to the old color. I could fix this problem with a little delay so that the color is switched back some milliseconds later. So the color is visible even if the user only taps shortly.
– Philipp Otto
Aug 19 '15 at 15:49
I ran exactly in the same problem. If I only tap the view than nothing happens because the color is already back to the old color. I could fix this problem with a little delay so that the color is switched back some milliseconds later. So the color is visible even if the user only taps shortly.
– Philipp Otto
Aug 19 '15 at 15:49
Also, I think the "Touch Down" method is risky. First, it doesn't reset the color automatically. That's easy enough, on "Touch-up Inside" just set it back to the original color. But what if the user does something abnormal, like pushes down, then decides not to continue, and drags their finger off. The color won't reset.
– Dave G
Jan 2 '16 at 22:56
Also, I think the "Touch Down" method is risky. First, it doesn't reset the color automatically. That's easy enough, on "Touch-up Inside" just set it back to the original color. But what if the user does something abnormal, like pushes down, then decides not to continue, and drags their finger off. The color won't reset.
– Dave G
Jan 2 '16 at 22:56
add a comment |
Swift 4 Version of this solution:
extension UIButton {
func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
setBackgroundImage(colorImage, for: state)
}
}
2
Just a small improvement to the code, to avoid force-unwraps try doing this:if let currentGraphicsContext = UIGraphicsGetCurrentContext() { currentGraphicsContext.setFillColor(color.cgColor) currentGraphicsContext.fill(CGRect(x: 0, y: 0, width: 1, height: 1)) }
Plus addinglayer.masksToBounds = true
to keep the functionality oflayer.cornerRadius
– T. Hyldgaard
Jan 24 '18 at 13:41
add a comment |
Swift 4 Version of this solution:
extension UIButton {
func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
setBackgroundImage(colorImage, for: state)
}
}
2
Just a small improvement to the code, to avoid force-unwraps try doing this:if let currentGraphicsContext = UIGraphicsGetCurrentContext() { currentGraphicsContext.setFillColor(color.cgColor) currentGraphicsContext.fill(CGRect(x: 0, y: 0, width: 1, height: 1)) }
Plus addinglayer.masksToBounds = true
to keep the functionality oflayer.cornerRadius
– T. Hyldgaard
Jan 24 '18 at 13:41
add a comment |
Swift 4 Version of this solution:
extension UIButton {
func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
setBackgroundImage(colorImage, for: state)
}
}
Swift 4 Version of this solution:
extension UIButton {
func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
setBackgroundImage(colorImage, for: state)
}
}
answered Nov 20 '17 at 15:58
kaktusgruenkaktusgruen
826
826
2
Just a small improvement to the code, to avoid force-unwraps try doing this:if let currentGraphicsContext = UIGraphicsGetCurrentContext() { currentGraphicsContext.setFillColor(color.cgColor) currentGraphicsContext.fill(CGRect(x: 0, y: 0, width: 1, height: 1)) }
Plus addinglayer.masksToBounds = true
to keep the functionality oflayer.cornerRadius
– T. Hyldgaard
Jan 24 '18 at 13:41
add a comment |
2
Just a small improvement to the code, to avoid force-unwraps try doing this:if let currentGraphicsContext = UIGraphicsGetCurrentContext() { currentGraphicsContext.setFillColor(color.cgColor) currentGraphicsContext.fill(CGRect(x: 0, y: 0, width: 1, height: 1)) }
Plus addinglayer.masksToBounds = true
to keep the functionality oflayer.cornerRadius
– T. Hyldgaard
Jan 24 '18 at 13:41
2
2
Just a small improvement to the code, to avoid force-unwraps try doing this:
if let currentGraphicsContext = UIGraphicsGetCurrentContext() { currentGraphicsContext.setFillColor(color.cgColor) currentGraphicsContext.fill(CGRect(x: 0, y: 0, width: 1, height: 1)) }
Plus adding layer.masksToBounds = true
to keep the functionality of layer.cornerRadius
– T. Hyldgaard
Jan 24 '18 at 13:41
Just a small improvement to the code, to avoid force-unwraps try doing this:
if let currentGraphicsContext = UIGraphicsGetCurrentContext() { currentGraphicsContext.setFillColor(color.cgColor) currentGraphicsContext.fill(CGRect(x: 0, y: 0, width: 1, height: 1)) }
Plus adding layer.masksToBounds = true
to keep the functionality of layer.cornerRadius
– T. Hyldgaard
Jan 24 '18 at 13:41
add a comment |
Update Swift 4
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}
Event
Button Action
Show Touch On Hightlight
add a comment |
Update Swift 4
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}
Event
Button Action
Show Touch On Hightlight
add a comment |
Update Swift 4
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}
Event
Button Action
Show Touch On Hightlight
Update Swift 4
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}
Event
Button Action
Show Touch On Hightlight
edited Apr 11 '18 at 10:56
answered Apr 11 '18 at 9:38
Puji WahonoPuji Wahono
1137
1137
add a comment |
add a comment |
Seems nobody here has mentioned using Key Value Observation yet, but it's another approach.
A reason for doing so instead of picking the other answers here is you don't need to go creating new images all the time nor be concerned with secondary effects of assigning images to buttons (e.g. cornerRadius effects).
But you'll need to create a class for the observer, who would be responsible for storing the different background colours and applying them in the observeValue()
method.
public class ButtonHighlighterObserver: NSObject {
var observedButton:UIButton? = nil
var backgroundColor: UIColor = UIColor.white
var backgroundHighlightColor: UIColor = UIColor.gray
public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
// Perform background color changes when highlight state change is observed
if keyPath == "highlighted", object as? UIButton === observedButton {
observedButton!.backgroundColor = observedButton!.isHighlighted ? self.backgroundHighlightColor : self.backgroundColor
}
}
}
Then all you need to do is manage addObserver / removeObserver during operation:
// Add observer to button's highlighted value
button.addObserver(anObserver, forKeyPath: "highlighted", options: [.new], context: nil)
anObserver.observedButton = button
// ...
// And at deinit time, be sure you remove the observer again
anObserver.observedButton?.removeObserver(item, forKeyPath: "highlighted")
anObserver.observedButton = nil
add a comment |
Seems nobody here has mentioned using Key Value Observation yet, but it's another approach.
A reason for doing so instead of picking the other answers here is you don't need to go creating new images all the time nor be concerned with secondary effects of assigning images to buttons (e.g. cornerRadius effects).
But you'll need to create a class for the observer, who would be responsible for storing the different background colours and applying them in the observeValue()
method.
public class ButtonHighlighterObserver: NSObject {
var observedButton:UIButton? = nil
var backgroundColor: UIColor = UIColor.white
var backgroundHighlightColor: UIColor = UIColor.gray
public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
// Perform background color changes when highlight state change is observed
if keyPath == "highlighted", object as? UIButton === observedButton {
observedButton!.backgroundColor = observedButton!.isHighlighted ? self.backgroundHighlightColor : self.backgroundColor
}
}
}
Then all you need to do is manage addObserver / removeObserver during operation:
// Add observer to button's highlighted value
button.addObserver(anObserver, forKeyPath: "highlighted", options: [.new], context: nil)
anObserver.observedButton = button
// ...
// And at deinit time, be sure you remove the observer again
anObserver.observedButton?.removeObserver(item, forKeyPath: "highlighted")
anObserver.observedButton = nil
add a comment |
Seems nobody here has mentioned using Key Value Observation yet, but it's another approach.
A reason for doing so instead of picking the other answers here is you don't need to go creating new images all the time nor be concerned with secondary effects of assigning images to buttons (e.g. cornerRadius effects).
But you'll need to create a class for the observer, who would be responsible for storing the different background colours and applying them in the observeValue()
method.
public class ButtonHighlighterObserver: NSObject {
var observedButton:UIButton? = nil
var backgroundColor: UIColor = UIColor.white
var backgroundHighlightColor: UIColor = UIColor.gray
public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
// Perform background color changes when highlight state change is observed
if keyPath == "highlighted", object as? UIButton === observedButton {
observedButton!.backgroundColor = observedButton!.isHighlighted ? self.backgroundHighlightColor : self.backgroundColor
}
}
}
Then all you need to do is manage addObserver / removeObserver during operation:
// Add observer to button's highlighted value
button.addObserver(anObserver, forKeyPath: "highlighted", options: [.new], context: nil)
anObserver.observedButton = button
// ...
// And at deinit time, be sure you remove the observer again
anObserver.observedButton?.removeObserver(item, forKeyPath: "highlighted")
anObserver.observedButton = nil
Seems nobody here has mentioned using Key Value Observation yet, but it's another approach.
A reason for doing so instead of picking the other answers here is you don't need to go creating new images all the time nor be concerned with secondary effects of assigning images to buttons (e.g. cornerRadius effects).
But you'll need to create a class for the observer, who would be responsible for storing the different background colours and applying them in the observeValue()
method.
public class ButtonHighlighterObserver: NSObject {
var observedButton:UIButton? = nil
var backgroundColor: UIColor = UIColor.white
var backgroundHighlightColor: UIColor = UIColor.gray
public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
// Perform background color changes when highlight state change is observed
if keyPath == "highlighted", object as? UIButton === observedButton {
observedButton!.backgroundColor = observedButton!.isHighlighted ? self.backgroundHighlightColor : self.backgroundColor
}
}
}
Then all you need to do is manage addObserver / removeObserver during operation:
// Add observer to button's highlighted value
button.addObserver(anObserver, forKeyPath: "highlighted", options: [.new], context: nil)
anObserver.observedButton = button
// ...
// And at deinit time, be sure you remove the observer again
anObserver.observedButton?.removeObserver(item, forKeyPath: "highlighted")
anObserver.observedButton = nil
answered Feb 14 '18 at 14:41
MeteMete
3,10622027
3,10622027
add a comment |
add a comment |
Can we do the same using run time attributes?
@IBInspectable var HighlightedBackground: Bool {
get {
return true
}
set {
layer.backgroundColor = Common.sharedInstance.OrangeColor.CGColor
print("highlighted state")
}
}
add a comment |
Can we do the same using run time attributes?
@IBInspectable var HighlightedBackground: Bool {
get {
return true
}
set {
layer.backgroundColor = Common.sharedInstance.OrangeColor.CGColor
print("highlighted state")
}
}
add a comment |
Can we do the same using run time attributes?
@IBInspectable var HighlightedBackground: Bool {
get {
return true
}
set {
layer.backgroundColor = Common.sharedInstance.OrangeColor.CGColor
print("highlighted state")
}
}
Can we do the same using run time attributes?
@IBInspectable var HighlightedBackground: Bool {
get {
return true
}
set {
layer.backgroundColor = Common.sharedInstance.OrangeColor.CGColor
print("highlighted state")
}
}
edited Nov 16 '15 at 8:38
Manjunath Ballur
4,70732239
4,70732239
answered Nov 16 '15 at 8:00
Sonika SoodSonika Sood
207
207
add a comment |
add a comment |
Why not?
@implementation UIButton (Color)
- (void) setBackgroundColor:(UIColor*)color forState:(UIControlState)state
{
[self setBackgroundImage:[UIImage.alloc initWithCIImage:[CIImage imageWithColor:[CIColor colorWithCGColor:color.CGColor]]] forState:state];
}
@end
add a comment |
Why not?
@implementation UIButton (Color)
- (void) setBackgroundColor:(UIColor*)color forState:(UIControlState)state
{
[self setBackgroundImage:[UIImage.alloc initWithCIImage:[CIImage imageWithColor:[CIColor colorWithCGColor:color.CGColor]]] forState:state];
}
@end
add a comment |
Why not?
@implementation UIButton (Color)
- (void) setBackgroundColor:(UIColor*)color forState:(UIControlState)state
{
[self setBackgroundImage:[UIImage.alloc initWithCIImage:[CIImage imageWithColor:[CIColor colorWithCGColor:color.CGColor]]] forState:state];
}
@end
Why not?
@implementation UIButton (Color)
- (void) setBackgroundColor:(UIColor*)color forState:(UIControlState)state
{
[self setBackgroundImage:[UIImage.alloc initWithCIImage:[CIImage imageWithColor:[CIColor colorWithCGColor:color.CGColor]]] forState:state];
}
@end
edited Aug 7 '18 at 12:50
answered Aug 7 '18 at 10:33
poGUIstpoGUIst
240310
240310
add a comment |
add a comment |
Swift 4+ compatibility for the accepted answer :
extension UIButton {
/// Sets the background color to use for the specified button state.
func setBackgroundColor(color: UIColor, forState: UIControlState) {
let minimumSize: CGSize = CGSize(width: 1.0, height: 1.0)
UIGraphicsBeginImageContext(minimumSize)
if let context = UIGraphicsGetCurrentContext() {
context.setFillColor(color.cgColor)
context.fill(CGRect(origin: .zero, size: minimumSize))
}
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.clipsToBounds = true
self.setBackgroundImage(colorImage, for: forState)
}
}
Compatible SwiftLint and fix the bug of broken auto layout / corner radius.
Or you can change your button type tosystem
instead ofcustom
– Maximelc
Sep 19 '18 at 12:12
add a comment |
Swift 4+ compatibility for the accepted answer :
extension UIButton {
/// Sets the background color to use for the specified button state.
func setBackgroundColor(color: UIColor, forState: UIControlState) {
let minimumSize: CGSize = CGSize(width: 1.0, height: 1.0)
UIGraphicsBeginImageContext(minimumSize)
if let context = UIGraphicsGetCurrentContext() {
context.setFillColor(color.cgColor)
context.fill(CGRect(origin: .zero, size: minimumSize))
}
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.clipsToBounds = true
self.setBackgroundImage(colorImage, for: forState)
}
}
Compatible SwiftLint and fix the bug of broken auto layout / corner radius.
Or you can change your button type tosystem
instead ofcustom
– Maximelc
Sep 19 '18 at 12:12
add a comment |
Swift 4+ compatibility for the accepted answer :
extension UIButton {
/// Sets the background color to use for the specified button state.
func setBackgroundColor(color: UIColor, forState: UIControlState) {
let minimumSize: CGSize = CGSize(width: 1.0, height: 1.0)
UIGraphicsBeginImageContext(minimumSize)
if let context = UIGraphicsGetCurrentContext() {
context.setFillColor(color.cgColor)
context.fill(CGRect(origin: .zero, size: minimumSize))
}
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.clipsToBounds = true
self.setBackgroundImage(colorImage, for: forState)
}
}
Compatible SwiftLint and fix the bug of broken auto layout / corner radius.
Swift 4+ compatibility for the accepted answer :
extension UIButton {
/// Sets the background color to use for the specified button state.
func setBackgroundColor(color: UIColor, forState: UIControlState) {
let minimumSize: CGSize = CGSize(width: 1.0, height: 1.0)
UIGraphicsBeginImageContext(minimumSize)
if let context = UIGraphicsGetCurrentContext() {
context.setFillColor(color.cgColor)
context.fill(CGRect(origin: .zero, size: minimumSize))
}
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.clipsToBounds = true
self.setBackgroundImage(colorImage, for: forState)
}
}
Compatible SwiftLint and fix the bug of broken auto layout / corner radius.
edited Sep 19 '18 at 14:03
answered Sep 19 '18 at 10:42
MaximelcMaximelc
9801216
9801216
Or you can change your button type tosystem
instead ofcustom
– Maximelc
Sep 19 '18 at 12:12
add a comment |
Or you can change your button type tosystem
instead ofcustom
– Maximelc
Sep 19 '18 at 12:12
Or you can change your button type to
system
instead of custom
– Maximelc
Sep 19 '18 at 12:12
Or you can change your button type to
system
instead of custom
– Maximelc
Sep 19 '18 at 12:12
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f26600980%2fhow-do-i-set-uibutton-background-color-forstate-uicontrolstate-highlighted-in-s%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Check this post somethingaboutios.wordpress.com/2016/02/09/… Swift example at the end of the post.
– Gabriel.Massana
Feb 9 '16 at 21:03