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.