1
votes

I have a button that pushes to a settings viewController. On that settings viewController I has a switch to invert all the colors on the original view, an inversion which I've done programmatically. I made inverted button images to replace the original images.

When I return to the original view, I have viewWillAppear call the method to invert if the switch has been flipped. Everything changes accordingly except for two disabled buttons.

The switch value is saved under the default settings so that the user can exit the app and come back later and still have the colors inverted. When viewDidLoad calls the invert method, the buttons change just fine, and they even show up adjusted to show they are disabled.

Any idea what might be going on?

-(void)invert{

self.view.backgroundColor = [UIColor blackColor];

//Buttons
[self.stopButton setImage:[UIImage imageNamed:@"stopinverted"]
                 forState:UIControlStateNormal];
[self.playButton setImage:[UIImage imageNamed:@"playinverted"]
                 forState:UIControlStateNormal];
}

-(void)viewWillAppear:(BOOL)animated{

    _inverted = 
      [[NSUserDefaults standardUserDefaults] boolForKey:@"isInvertedOn"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    if(_inverted){
        [self invert];
    } else {
        [self unInvert];
    }
    [super viewWillAppear:(BOOL)animated];
}
4

4 Answers

2
votes

The issue seems to be that the image is not updated automatically, you'll need to reset the enabled value to make it work:

[self.stopButton setImage:[UIImage imageNamed:@"stopinverted"]
                 forState:UIControlStateNormal];
self.stopButton.enabled = ! self.stopButton.enabled;
self.stopButton.enabled = ! self.stopButton.enabled;

[self.playButton setImage:[UIImage imageNamed:@"playinverted"]
                 forState:UIControlStateNormal];
self.playButton.enabled = ! self.playButton.enabled;
self.playButton.enabled = ! self.playButton.enabled;
1
votes

I think you are disabling stopButton and playButton before applying the image. And also you are applying UIImage for UIButton normal UIControlState. I would suggest do the following code changes

Change this

//Buttons
[self.stopButton setImage:[UIImage imageNamed:@"stopinverted"]
                 forState:UIControlStateNormal];
[self.playButton setImage:[UIImage imageNamed:@"playinverted"]
                 forState:UIControlStateNormal];

to

//Buttons
[self.stopButton setImage:[UIImage imageNamed:@"stopinverted"]
                 forState:UIControlStateDisabled];        
[self.playButton setImage:[UIImage imageNamed:@"playinverted"]
                 forState:UIControlStateDisabled];

In short you have to set UIButton UIImages in disabled state.

For more reference have a look this questions answer Xcode: set image on button only for default state, not also selected

If you set the UIImages according to the state of the UIButton then in the function in which you want to invert the UIImage, you have to only need to handle the state of the UIButton and it will automatically change the image.

0
votes

Thanks for the help. Here is the answer I came up with, inspired by A-Live's answer.

First I had to set the button as enabled, then set the image, and then disable the button again all within the same method. This has fixed my problem.

[self.playButton setEnabled:YES];
[self.playButton setImage:[UIImage imageNamed:@"playinverted"]forState:UIControlStateNormal];
[self.playButton setEnabled:NO];
0
votes

try using :

theButton.adjustsImageWhenDisabled = false

this will use your custom image instead of the default dimming.