简体   繁体   中英

UIButton state changing

I have a custom ImagePicker. A UIScrollView with images from my NSDocumentDirectory then I added the button as my images' frame, Like a thumbnail View. What I added is when It is selected then dismissed, the next time the view loads/appears/shows it will have an image checkmark already. It was okay. But what I need is, when I tap an image it will be selected already or the image "checkmark" will be shown, then when I tap the same image the checkmark will be gone.

Here is an explanation of the codes I have:

// The UISCrollView

- (void)viewDidLoad {

    // Create view
    UIScrollView *view = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0f,0.0f,1024.0f,768.0f)];

    int row = 0;
    int column = 0;
    for(int i = 0; i < _thumbs.count; ++i) {

        UIImage *thumb = [_thumbs objectAtIndex:i];
        myButton = [UIButton buttonWithType:UIButtonTypeCustom];
        myButton.frame = CGRectMake(column*140+24, row*150+10, 100, 100);
        [myButton setImage:thumb forState:UIControlStateNormal];
        [myButton addTarget:self 
                     action:@selector(buttonClicked:) 
           forControlEvents:UIControlEventTouchUpInside];
        myButton.tag = i; 
        NSLog(@"%i",i);

        NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
        NSInteger selectedImageSlot1 = [prefs integerForKey:@"selected1"];

        if ( selectedImageSlot1 == i){
            [self turnButtonToSelected];
        } 
}

// When button is tapped

- (IBAction)buttonClicked:(id)sender {
    myButton = (UIButton *)sender;
    self.selectedImage = [_images objectAtIndex:myButton.tag];

    [[NSUserDefaults standardUserDefaults] setInteger:myButton.tag forKey:@"selected1"];

    [self dismissModalViewControllerAnimated:NO];
}

// method when button is selected

   - (void)turnButtonToSelected
    {
        UIImage *bgImage = [UIImage imageNamed:@"Checkmark.png"];
        [myButton setBackgroundImage:bgImage forState:UIControlStateNormal];
        [myButton setBackgroundImage:bgImage forState:UIControlStateHighlighted];
        [myButton setBackgroundImage:bgImage forState:UIControlStateDisabled];
        [myButton setEnabled:NO];
    }

Keep a Boolean value for if the button is selected or not. In your interface keep a boolean variable named BOOL selected; Keep track of the value, and manage to save it. Then in your turnButtonToSelected method add this:

- (void)turnButtonToSelected
{
   selected = !selected;
   if (selected)
   {
      UIImage *bgImage = [UIImage imageNamed:@"Checkmark.png"];
      [myButton setBackgroundImage:bgImage forState:UIControlStateNormal];
      [myButton setBackgroundImage:bgImage forState:UIControlStateHighlighted];
      [myButton setBackgroundImage:bgImage forState:UIControlStateDisabled];
   }
   else
   {
      // set button image without the check mark
   }
}

This will make sure, if the button was selected previously and now tapped again the checkmark will be gone.

First u need to keep the selected image index around, so create a selectedImageIndex instance variable.
Then in viewDidLoad there is no need to call

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSInteger selectedImageSlot1 = [prefs integerForKey:@"selected1"];  

in the for loop...
Put it before the for loop and store the selected image index in selectedImageIndex.

- (void)viewDidLoad {

    // Create view
    UIScrollView *view = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0f,0.0f,1024.0f,768.0f)];

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    self.selectedImageIndex = [prefs integerForKey:@"selected1"];

    int row = 0;
    int column = 0;
    for(int i = 0; i < _thumbs.count+1; ++i) {

        UIImage *thumb = [_thumbs objectAtIndex:i];
        myButton = [UIButton buttonWithType:UIButtonTypeCustom];
        myButton.frame = CGRectMake(column*140+24, row*150+10, 100, 100);
        [myButton setImage:thumb forState:UIControlStateNormal];
        [myButton addTarget:self 
                     action:@selector(buttonClicked:) 
           forControlEvents:UIControlEventTouchUpInside];
        myButton.tag = i+1; 
        NSLog(@"%i",i);


        if (self.selectedImageIndex == myButton.tag){
            [self turnButtonToSelected:myButton];
        } 
}  

Remove the line [myButton setEnabled:NO]; from turnButtonToSelected so that the user can re-tap on the button to deselect it. change turnButtonToSelected to:

   - (void)turnButtonToSelected:(UIButton *)button
    {
        UIImage *bgImage = [UIImage imageNamed:@"Checkmark.png"];
        [button setBackgroundImage:bgImage forState:UIControlStateNormal];
        [button setBackgroundImage:bgImage forState:UIControlStateHighlighted];
        [button setBackgroundImage:bgImage forState:UIControlStateDisabled];
    }    

    - (void)turnButtonToDeselected:(UIButton *)button
    {
        UIImage *bgImage = [UIImage imageNamed:@"Not-Checkmark.png"];
        [button setBackgroundImage:bgImage forState:UIControlStateNormal];
        [button setBackgroundImage:bgImage forState:UIControlStateHighlighted];
        [button setBackgroundImage:bgImage forState:UIControlStateDisabled];
    }

Then when user tap on an image, u check if this image is currently selected.
If yes - u call turnButtonToDeselected .
If no - u call turnButtonToSelected

- (IBAction)buttonClicked:(id)sender {
    myButton = (UIButton *)sender;
    self.selectedImage = [_images objectAtIndex:myButton.tag - 1];

    [[NSUserDefaults standardUserDefaults] setInteger:myButton.tag forKey:@"selected1"];

    if (myButton.tag == self.selectedImageIndex) {
        // user tap on a button that was selected, so we need to deselect it 
        [self turnButtonToDeselected:myButton];
    }
    else {
        // user tap on a button that wasn't selected

        // first we check if there is a selected button, if yes we need to deselect it
        if (self.selectedImageIndex > 0) {
            // get the selected button
            UIButton *selectedButton = (UIButton *)[self.view viewWithTag:self.selectedImageIndex];
            // deselect it
            [self turnButtonToDeselected:selectedButton];
        }

        // now we can select the button the user tapped on
        [self turnButtonToSelected:myButton];


        // save the selected index
        self.selectedImageIndex = myButton.tag;
    }
}

One more thing, in viewDidLoad set the button tag to i+1

you need to create button array.And when button click event you need to check button have set checkmark image or not.

-(IBAction)buttonclickevent:(id)sender{

  UIButton *btn=sender;

  UIButton *currentbutton=[ButtonArray objectAtIndex:btn.tag];


 if([currentbutton.currentImage isEqual:[UIImage imageNamed:@"Checkmark.png"]])

  [currentbutton setImage:[UIImage imageNamed:@"normal.png"]forState:UIControlStateNormal];

}
else {

  [currentbutton setImage:[UIImage imageNamed:@"Checkmark.png"]forState:UIControlStateNormal];
}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM