我知道如何更改常规按钮的状态,以及更改常规按钮的背景颜色。但是,当我执行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]
这样可以减轻按钮的负担,是否会使按钮变暗?
答案 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”状态的正确图像(在您的情况下,您只需在动作事件中切换)。