更改自定义按钮的状态(带图像的按钮)?

时间:2010-04-15 21:16:23

标签: iphone objective-c uibutton

我知道如何更改常规按钮的状态,以及更改常规按钮的背景颜色。但是,当我执行UIButton:setBackgroundImage(自定义按钮)时,我不能再改变状态了。我想,当用户点击它时,会在视觉上发生让用户知道该按钮被选中的事情,当用户再次点击它时,它会返回到常规状态。我尝试更改按钮的背景,但它不起作用。以下是我创建自定义按钮的方法

UIButton *b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
b.frame = CGRectMake(X, Y, H, W);
UIImage *iv = [UIImage imageWithContentsOfFile:picFilePath];
[b setBackgroundImage:iv forState:UIControlStateNormal];

按钮的图像由iPhone相机拍摄,因此无法使用不同的图像选择状态

[button setAlpha:0.8]

这样可以减轻按钮的负担,是否会使按钮变暗?

6 个答案:

答案 0 :(得分:4)

您需要在位图上下文中创建图像的副本,通过绘制叠加层或以某种方式处理它来修改副本,然后将修改后的图像分配给按钮的UIControlStateSelected状态。

下面是一些示例代码,用于创建上下文并在图像上为按钮的选定状态绘制50%的黑色覆盖图,使其变暗:

//assume UIImage* image exists

//get the size of the image
CGFloat pixelsHigh = image.size.height;
CGFloat pixelsWide = image.size.width;

//create a new context the same size as the image
CGContextRef    cx = NULL;
CGColorSpaceRef colorSpace;
void *          bitmapData;
int             bitmapByteCount;
int             bitmapBytesPerRow;

bitmapBytesPerRow   = (pixelsWide * 4);
bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);

colorSpace = CGColorSpaceCreateDeviceRGB();
bitmapData = malloc( bitmapByteCount );
if (bitmapData == NULL)
{
    fprintf (stderr, "Memory not allocated!");
    return;
}
cx = CGBitmapContextCreate (bitmapData,
                                 pixelsWide,
                                 pixelsHigh,
                                 8,      // bits per component
                                 bitmapBytesPerRow,
                                 colorSpace,
                                 kCGImageAlphaPremultipliedLast);
if (cx == NULL)
{
    free (bitmapData);
    fprintf (stderr, "Context not created!");
    return;
}
CGColorSpaceRelease( colorSpace );
CGRect imageRect = CGRectMake(0, 0, pixelsWide, pixelsHigh);

//draw the existing image in the context
CGContextDrawImage(cx, imageRect, image.CGImage);

//draw a 50% black overlay
CGContextSetRGBFillColor(cx, 0, 0, 0, 0.5);
CGContextFillRect(cx, imageRect);

//create a new image from the context
CGImageRef newImage = CGBitmapContextCreateImage(cx);
UIImage* secondaryImage = [UIImage imageWithCGImage:newImage];
CGImageRelease(newImage);
CGContextRelease(cx);

//assign the images to the button
[button setBackgroundImage:image forState:UIControlStateNormal];
[button setBackgroundImage:secondaryImage forState:UIControlStateSelected];

答案 1 :(得分:1)

为什么让图像覆盖按钮而不是将按钮的背景设置为图像?

编辑:     你想要做的是让突出显示和/或选择状态按钮具有不同的背景,如下所示。

UIImage* highlightImage = [UIImage imageNamed:@"highlightImage.png"];
[b setBackgroundImage:highlightImage forState:UIControlStateSelected];

然后在你的事件处理程序

- (void)buttonOnclick
{
   b.selected = !b.selected;
}

答案 2 :(得分:1)

UIButton *b = [UIButton buttonWithType:UIButtonRoundedRect];
b.frame = CGRectMake(X,Y,H,W);

// set a different background image for each state
[b setBackgroundImage:myNormalBackgroundImage forState:UIControlStateNormal];
[b setBackgroundImage:mySelectedBackgroundImage forState:UIControlStateSelected];

答案 3 :(得分:1)

要使按钮变暗,假设背景包含图像,则可以向视图添加子图层(按钮)。子图层将覆盖背景图像。您可以使用该图层在背景图像上提供“色调”。

您可以创建一个黑色或灰色层的暗化层,其alpha值为0.3左右。您可以使用白色图层和适当的Alpha创建闪电图层。

请参阅CALayer Class Reference以了解如何创建图层,然后将子图层插入按钮的视图中,如下所示:

[self.layer insertSublayer:darkeningLayer atIndex:0];

我用它在视图的背景上插入渐变图层。

答案 4 :(得分:0)

您可能需要为每个适当的状态设置背景图像。

答案 5 :(得分:-1)

我使用setImage而不是setBackgroundImage在我的应用程序中执行此操作,它对我来说很好。代码如下所示:

[button setImage:[self eraserImageForSize:radius selected:selected]
        forState:UIControlStateNormal];

...其中eraserImageForSize:selected:返回“selected”状态的正确图像(在您的情况下,您只需在动作事件中切换)。