以编程方式更改按钮状态

3
我在图片按钮框架方面遇到了问题,希望得到您的帮助。我的要求如下: 1. 当该按钮被选中时,应有一个勾号。 2. 当视图关闭并返回到之前的屏幕时,该图像仍应为选择状态。 3. 当我点击已选中的图像或其他图像时,勾号会被删除。
我能够实现上述功能,但是我在设置图像时遇到了问题。我期望的效果如下图所示: enter image description here
UIImage *bgImage = [UIImage imageNamed:@"AGIPC-Checkmark-iPhone.png"];
[myButton setBackgroundImage:bgImage forState:UIControlStateDisabled];
[myButton setEnabled:NO];

但这是我需要的函数:

在此输入图片描述

UIImage *bgImage = [UIImage imageNamed:@"AGIPC-Checkmark-iPhone.png"];
[myButton setImage:bgImage forState:UIControlStateSelected];
[myButton setSelected:YES];

以下是代码(如果我的做法有问题,请告诉我,谢谢):
- (void)viewDidLoad {
    UIImage *bgImage = [UIImage imageNamed:@"AGIPC-Checkmark-iPhone.png"];
    [myButton setBackgroundImage:bgImage forState:UIControlStateHighlighted];
    [myButton setBackgroundImage:bgImage forState:UIControlStateDisabled];
    // 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];
        } 

        [view addSubview:myButton];

        if (column == 6) {
            column = 0;
            row++;
        } else {
            column++;
        }

    }

    [view setContentSize:CGSizeMake(1024, (row+1) * 150 + 10)];
}

- (void)turnButtonToSelected
{       UIImage *bgImage = [UIImage imageNamed:@"AGIPC-Checkmark-iPhone.png"];
    [myButton setBackgroundImage:bgImage forState:UIControlStateNormal];
    [myButton setBackgroundImage:bgImage forState:UIControlStateHighlighted];
    [myButton setBackgroundImage:bgImage forState:UIControlStateDisabled];
    [myButton setEnabled:NO];
}
- (void)highlightButton:(UIButton *)a {
    //[self turnButtonToSelected];    
}
- (IBAction)buttonClicked:(id)sender {
    myButton = (UIButton *)sender;
    self.selectedImage = [_images objectAtIndex:myButton.tag];

    if (myButton.selected) {

        [sender setSelected:NO];

    }else {

        UIImage *bgImage = [UIImage imageNamed:@"AGIPC-Checkmark-iPhone.png"];
        [sender setImage:bgImage forState:UIControlStateSelected];
        [sender setSelected:YES];
    }


    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    [prefs setInteger:myButton.tag forKey:@"slot1"];

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

    [[NSUserDefaults standardUserDefaults] synchronize];


    [self performSelector:@selector(highlightButton:) withObject:sender afterDelay:0.0];
    [self dismissModalViewControllerAnimated:NO];

}

还是有一种方法可以在按下按钮时强制启用它,即使它已被禁用吗?

你尝试过在 UIControlStateNormalUIControlStateSelected 之间改变按钮的状态吗? - Kjuly
是的,我有。我不知道为什么它看起来像那样。 - Bazinga
3个回答

4

我刚刚尝试了另一种方法。

对我来说,它可以很好地实现你想要的效果。

如果需要进一步解释或整个Xcode项目,请告诉我。

- (void)viewDidLoad
{
    [super viewDidLoad];

    //button 1
    UIButton *imageButton = [UIButton buttonWithType:UIButtonTypeCustom];
    imageButton.frame = CGRectMake(30, 50, 100, 80);
    UIImage *btnImage = [UIImage imageNamed:@"DSC_5359.JPG"];
    [imageButton setBackgroundImage:btnImage forState:UIControlStateNormal];
    [imageButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchDown];

    //button 2
    UIButton *imageButton2 = [UIButton buttonWithType:UIButtonTypeCustom];
    imageButton2.frame = CGRectMake(180, 50, 100, 80);
    UIImage *btnImage2 = [UIImage imageNamed:@"DSC_5355.JPG"];
    [imageButton2 setBackgroundImage:btnImage2 forState:UIControlStateNormal];
    [imageButton2 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchDown];

    [self.view addSubview:imageButton];
    [self.view addSubview:imageButton2];
}

- (void)buttonClicked:(UIButton*)button
{
    //NSLog(@"Button clicked! %@", button);

    UIImage *checkmarkImage = [UIImage imageNamed:@"check.png"];
    UIImage *empty = nil;

    //NSLog(@"Imageview: %d", button.imageView.tag);
    if (button.imageView.tag == 0)
    {
        [button setImage:checkmarkImage forState:UIControlStateNormal];
        button.imageView.tag = 1;
    }
    else
    {
        [button setImage:empty forState:UIControlStateNormal];
        button.imageView.tag = 0;
    }
}

您好,Chris:

更新:我已经更新了代码。这里是整个视图控制器的代码。请注意:我将使用coreData来存储当前索引来解决此问题。以下代码并不是解决此问题的最佳方法,但基于您最初的代码!

//
//  SOViewController.m
//  SOImageOverlay
//
//  Created by Chris on 24.07.12.
//

#import "SOViewController.h"

@interface SOViewController ()

@end


#define CHECKMARK_IMAGE @"check.png"

@implementation SOViewController

@synthesize buttons = _buttons;

#pragma mark - Custom getter
- (NSMutableArray*)buttons
{
    if (_buttons == nil)
        _buttons = [[NSMutableArray alloc] init];

    return _buttons;
}


#pragma mark - View lifecycle
- (void)viewDidLoad
{
    [super viewDidLoad];

//    UIImage *bgImage = [UIImage imageNamed:CHECKMARK_IMAGE];
//    UIButton *myButton = 
//    [myButton setBackgroundImage:bgImage forState:UIControlStateHighlighted];
//    [myButton setBackgroundImage:bgImage forState:UIControlStateDisabled];
    // 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 < 2; ++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);*/

        UIButton *imageButton = [UIButton buttonWithType:UIButtonTypeCustom];
        if (i == 0)
        {
            UIImage *btnImage = [UIImage imageNamed:@"DSC_5359.JPG"];
            imageButton.frame = CGRectMake(30, 50, 100, 80);
            [imageButton setBackgroundImage:btnImage forState:UIControlStateNormal];
        }
        else if (i == 1)
         {
             UIImage *btnImage = [UIImage imageNamed:@"DSC_5355.JPG"];
             imageButton.frame = CGRectMake(180, 50, 100, 80);
             [imageButton setBackgroundImage:btnImage forState:UIControlStateNormal];
         }

        [imageButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchDown];

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

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

        [self.view addSubview:imageButton];

        //adding current button into buttons array
        [self.buttons addObject:imageButton];

        if (column == 6) {
            column = 0;
            row++;
        } else {
            column++;
        }

    }

    //[view setContentSize:CGSizeMake(1024, (row+1) * 150 + 10)];


//    //button 1
//    UIButton *imageButton = [UIButton buttonWithType:UIButtonTypeCustom];
//    imageButton.frame = CGRectMake(30, 50, 100, 80);
//    UIImage *btnImage = [UIImage imageNamed:@"DSC_5359.JPG"];
//    [imageButton setBackgroundImage:btnImage forState:UIControlStateNormal];
//    [imageButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchDown];
//    
//    //button 2
//    UIButton *imageButton2 = [UIButton buttonWithType:UIButtonTypeCustom];
//    imageButton2.frame = CGRectMake(180, 50, 100, 80);
//    UIImage *btnImage2 = [UIImage imageNamed:@"DSC_5355.JPG"];
//    [imageButton2 setBackgroundImage:btnImage2 forState:UIControlStateNormal];
//    [imageButton2 addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchDown];
//
//    [self.view addSubview:imageButton];
//    [self.view addSubview:imageButton2];
}

//- (void)buttonClicked:(UIButton*)button
//{
//    //NSLog(@"Button clicked! %@", button);
//    
//    UIImage *checkmarkImage = [UIImage imageNamed:@"check.png"];
//    UIImage *empty = nil;
//    
//    //NSLog(@"Imageview: %d", button.imageView.tag);
//    if (button.imageView.tag == 0)
//    {
//        [button setImage:checkmarkImage forState:UIControlStateNormal];
//        button.imageView.tag = 1;
//    }
//    else
//    {
//        [button setImage:empty forState:UIControlStateNormal];
//        button.imageView.tag = 0;
//    }
//}



// code from stackoverflow
// ------------------------------------------------------------
- (void)turnButtonToSelected:(UIButton*)button
{       
    UIImage *bgImage = [UIImage imageNamed:CHECKMARK_IMAGE];

    //UIButton *myButton = button; //just to use the copied code
    button.selected = YES;
    [button setImage:bgImage forState:UIControlStateSelected];


//    [myButton setBackgroundImage:bgImage forState:UIControlStateNormal];
//    [myButton setBackgroundImage:bgImage forState:UIControlStateHighlighted];
//    [myButton setBackgroundImage:bgImage forState:UIControlStateDisabled];
//    [myButton setEnabled:NO];
}
- (void)highlightButton:(UIButton *)a {
    //[self turnButtonToSelected];    
}

- (IBAction)buttonClicked:(id)sender 
{
    UIButton *myButton = (UIButton *)sender;
    //I have removed this line... due to the fact that I don't want to 
    //implement your arrays.
    //self.selectedImage = [_images objectAtIndex:myButton.tag];

    //deselecting all
    for (UIButton *button in self.buttons)
    {
        button.selected = NO;
        //[button setImage:nil forState:UIControlStateNormal];
    }

    if (myButton.selected) {

        [sender setSelected:NO];

    }else {

        UIImage *bgImage = [UIImage imageNamed:CHECKMARK_IMAGE];
        [sender setImage:bgImage forState:UIControlStateSelected];
        [sender setSelected:YES];
    }


//    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
//    [prefs setInteger:myButton.tag forKey:@"slot1"];


    //getting index of button in array
    NSInteger index = 0;
    NSInteger foundIndex = -1;
    for (UIButton *button in self.buttons)
    {
        if (button == myButton)
        {
            foundIndex = index;
        }
        index++;
    }

    if (foundIndex >= 0)
    {
        [[NSUserDefaults standardUserDefaults] setInteger:foundIndex forKey:@"selected1"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }

    [self performSelector:@selector(highlightButton:) withObject:sender afterDelay:0.0];
   // [self dismissModalViewControllerAnimated:NO];

}
// ------------------------------------------------------------


- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}



- (IBAction)closeButtonClicked:(UIBarButtonItem *)sender 
{
    [self dismissModalViewControllerAnimated:YES];
}
@end

在Objective-C中,每个UIView(和派生类)都包含一个tag属性。通常情况下,当您例如在Storyboard中创建新视图时,可以通过标签访问此元素。它经常用于存储特定信息。您还可以使用.accessibleIdentifier来存储它是否被selected。但是,您需要将信息存储在元素本身上,而tag属性是实现此目的的一种方式。 :) - Chris
我已经完成了重叠部分,但是我需要的是当选择一张图片时,再选择另一张图片时会将另一张图片删除。 - Bazinga
好的,我来研究一下。首先:myButton是什么?一个属性吗? - Chris
好的,然后将其合成并将其用作self.myButton。然而,您确切想要实现什么? 我猜用户应该选择一个头像或类似的东西? 您能给我们更多的代码吗? - Chris
好的...我现在明白你的问题了。你的问题与模态视图有关。你想在用户再次打开模态视图时恢复所选条件? - Chris
让我们在聊天中继续这个讨论 - Chris

3

尝试这样做。

UIImage *bgImage = [UIImage imageNamed:@"AGIPC-Checkmark-iPhone.png"];
**[myButton setSelected:NO];
[myButton setBackgroundImage:bgImage forState:UIControlStateNormal];**


UIImage *bgImage = [UIImage imageNamed:@"AGIPC-Checkmark-iPhone.png"];
**[myButton setSelected:YES];
[myButton setImage:bgImage forState:UIControlStateSelected];**

在代码的后半部分,你将按钮的状态设置为“选中”,但在上面的代码中,你没有这样做。相反,你已经禁用了该按钮。请尝试使用我提供的上述代码。谢谢。

-1

当用户点击按钮时,在按钮上方添加一个 subview,使其成为子视图。

UIImage *button = [UIImage imageNamed:@"cat.png"];
[myButton setBackgroundImage:bgImage forState:UIControlStateNormal];
//添加 target button clicked
-(void)buttonClicked : (id)sender{ if(toogleSwitch){ [button addSubview:checkedimageView]; // 只添加已选图标 } else{ [imageview removeFromSuperview]; } }

你要做的事情只有在所有图片资源都有以下两种类型的情况下才能起作用: 1)图片本身 2)带有勾选框的透明层的图片。


1
UIButton 支持两个图像,即 backgroundImageimage 属性。因此,不必在顶部添加额外的图层。 - Chris
谢谢提供这些信息...我会在以后记住的 :) - Kunal Balani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接