Ios 更改按钮的图像

Ios 更改按钮的图像,ios,xcode,cocos2d-iphone,Ios,Xcode,Cocos2d Iphone,这似乎应该足够简单,但我找不到答案。我使用下面的函数创建了一个CCButton。现在,当事件发生时,我希望从该函数返回的CCButton的图像spriteFrame更改为另一个图像。有人能告诉我需要做什么吗 + (CCButton*) drawBitmap :(id)not_self :(NSString*)normalImage :(double)x :(double)y :(double)w :(double)h withSelector:(SEL)sel :(NSString*)butto

这似乎应该足够简单,但我找不到答案。我使用下面的函数创建了一个CCButton。现在,当事件发生时,我希望从该函数返回的CCButton的图像spriteFrame更改为另一个图像。有人能告诉我需要做什么吗

+ (CCButton*) drawBitmap :(id)not_self :(NSString*)normalImage :(double)x :(double)y :(double)w :(double)h withSelector:(SEL)sel :(NSString*)buttonName
{
    CGSize size = [[CCDirector sharedDirector] viewSize];
    double middleX = size.width * (w/2 + x);
    double middleY = size.height * (1 - y - h/2);

    CCButton *btn = [CCButton buttonWithTitle:@""
                                      spriteFrame:[CCSpriteFrame frameWithImageNamed:normalImage]
                           highlightedSpriteFrame:[CCSpriteFrame frameWithImageNamed:normalImage]
                              disabledSpriteFrame:[CCSpriteFrame frameWithImageNamed:normalImage]];
    [btn setName:buttonName];
    [btn setTarget:not_self selector:sel];

    btn.positionType=CCPositionTypeNormalized;
    [btn setScaleX: (size.width * w)/btn.contentSize.width];
    [btn setScaleY: (size.height * h)/btn.contentSize.height];
    btn.position = ccp(middleX/size.width , middleY/size.height);
    btn.cascadeOpacityEnabled=YES;

    [not_self addChild:btn];

    return btn;
}

以下是对我非常有效的代码:

//Creating button
CCSpriteFrame *aboutNormalImage = [CCSpriteFrame frameWithImageNamed:@"btn_about.png"];
CCSpriteFrame *aboutHighlightedImage = [CCSpriteFrame frameWithImageNamed:@"btn_about_pressed.png"];
CCButton *btnAbout = [CCButton buttonWithTitle:nil spriteFrame:aboutNormalImage highlightedSpriteFrame:aboutHighlightedImage disabledSpriteFrame:nil];

//..the button is added to scene here and so on

//Loading another frame
CCSpriteFrame *startNormalImage = [CCSpriteFrame frameWithImageNamed:@"btn_start.png"];

//Replacing
[btnAbout setBackgroundSpriteFrame:startNormalImage forState:CCControlStateNormal];

您是否尝试过挫折背景spriteframe:forState:?:您是否有使用setBackgroundSpriteFrame:forState的示例?我尝试了一些方法,请参见下面的代码,但无法使其正常工作。CCSpriteFrameCache*cache=[CCSpriteFrameCache sharedSpriteFrameCache];CCSpriteFrame*frame=[缓存spriteFrameByName:IMG_RIGHT_GREEN];[图像setBackgroundSpriteFrame:frame for State:CCControlStateNormal];将回复作为答案发布,以显示格式更好的代码。你的代码应该也能工作,但当然有很多原因不起作用。例如,IMG_RIGHT_GREEN可以是按钮已有的相同图像,因此你看不到效果,我们经常试图在不同的地方发现问题。我在下面添加了你的代码副本,以确保我做得正确,很抱歉格式化,但我得到了一个异常,它说:-[CCSprite setBackgroundSpriteFrame:forState:]:未识别的选择器发送到实例0x14e54980。有什么想法吗?CCButton*图像//如果事件{CCSpriteFrame*startNormalImage=[CCSpriteFrame FrameWithImageName:IMG_RIGHT_GREEN];[image setBackgroundSpriteFrame:startNormalImage forState:CCControlStateNormal];}添加了按钮属性。如果图像是CCButton,则不会发生您提到的异常。你能把你的完整代码粘贴到某个地方吗?我想我发现了我的问题,至少是部分问题。我有几个助手函数。一个将添加一个CCSprite,另一个将添加一个CCButton。我以为我在创建一个CCButton,但实际上我创建了一个CCSprite。这可以解释例外情况。我切换到返回CCButton的功能,现在图像发生了变化,但失真了。类似于这篇没有答案的帖子:我能够将其更改为CCSprite而不影响功能,然后我使用这篇帖子更改图像: