Изменить состояние настраиваемой кнопки (кнопки с изображением)? - PullRequest
1 голос
/ 16 апреля 2010

Я знаю, как изменить состояние обычной кнопки, а также изменить цвет фона обычной кнопки. Однако, когда я делаю 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 ]

4 голосов
/ 20 апреля 2010

Вам необходимо создать копию изображения в растровом контексте, изменить копию, нарисовав оверлей или обработав ее каким-либо образом, а затем назначить измененное изображение состоянию 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 голос
/ 21 апреля 2010

Чтобы затемнить кнопку, предполагая, что фон содержит изображение, вы можете добавить подслой к виду (кнопка). Подслой будет перекрывать фоновое изображение. Вы используете слой, чтобы обеспечить "оттенок" поверх фонового изображения.

Вы можете создать затемняющий слой с черным или серым слоем с альфа-значением 0,3 или около того. Вы можете создать осветляющий слой с белым слоем и соответствующей альфа.

См. CALayer Class Reference , чтобы узнать, как создать слой, затем вставьте подслой в вид кнопки следующим образом:

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

Я использовал это для вставки градиентных слоев поверх фона вида.

1 голос
/ 16 апреля 2010
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];
1 голос
/ 16 апреля 2010

Почему у вас изображение закрывает кнопку, а не задается фон кнопки с изображением?

РЕДАКТИРОВАТЬ: что вы хотите сделать, это сделать выделенную и / или выбранную кнопку состояния другимфон, как это.

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

Тогда в вашем обработчике событий

- (void)buttonOnclick
{
   b.selected = !b.selected;
}
0 голосов
/ 16 апреля 2010

Я делаю это в своем приложении, используя setImage, а не setBackgroundImage, и он прекрасно работает для меня. Код выглядит так:

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

... где eraserImageForSize: selected: возвращает правильное изображение для «выбранного» состояния (которое, в вашем случае, вы просто переключаете в событии действия).

0 голосов
/ 16 апреля 2010

Возможно, вам нужно установить фоновое изображение для каждого соответствующего состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...