iphone - right - uibutton with image and text swift




Change the state of a customized button(button with an image)? (3)

Why are you having the image cover the button rather than setting the background of the button to the image?

EDIT: What you want to do is make your highlighted and/or selected state button have a different background, like this.

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

Then in your event handler

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

I know how to change the state of the regular button, as well as change the background color of a regular button. However, when I do UIButton:setBackgroundImage (customized button), then I cant change the state anymore. I want, when the user click on it, something visually would happen to let the user know that button is selected, and when the user click again it go back to the regular state. I try to change the background of the button, but it doesnt work. Here is how I create my customized button

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

The images for the buttons are taken by the iPhone camera, therefore cant use different picture for selected state

[button setAlpha:0.8]

That would lighten up the button, is there something that would darken the button?


You need to create a copy of the image in a bitmap context, modify the copy by drawing an overlay or processing it in some way, and then assign the modified image to the button's UIControlStateSelected state.

Here is some sample code that creates the context and draws a 50% black overlay on the image for the selected state of the button, which darkens it:

//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];

How can I make image brighter (more light as flash effect) using Core Graphics

Have a look at my answer to this question. That question was about making an image darker, but you could use exactly the same code and make the image lighter by overlaying a partially transparent white color:

//draw a 50% white overlay
CGContextSetGrayFillColor(cx, 1.0, 0.5);
CGContextFillRect(cx, imageRect);




uibutton