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

前端 未结 6 2278
执笔经年
执笔经年 2021-02-11 09:34

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 (cu

6条回答
  •  时光取名叫无心
    2021-02-11 10:27

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

提交回复
热议问题