2010-04-15 6 views
1

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

Это будет светиться кнопка, является есть что-то, что бы затемнить кнопку?

ответ

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

super ... Большое спасибо –

1

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

EDIT: Что вы хотите сделать, это сделать выделенную вами и/или выбранную кнопку состояния отличной от фона.

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

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

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

На самом деле, я просто пересказываю код, пожалуйста, взгляните на них. –

+0

Изображения для кнопок взяты камерой iphone. поэтому я не могу сделать то, что предложили –

+0

. Вам нужно больше написать код или объяснить себя. Я не уверен, в чем проблема. Хотя, если я думаю, что я правильно вас понимаю, то, что я сделал бы, - это поставить UIView поверх кнопки, которую вы хотите выделить, установить этот пользовательский интерфейс UIViewInteractionEnabled = NO, фоновый альфа до 0 и цвет к выделенному цвету, который вы хотите. Затем, когда пользователь выбирает вашу кнопку, измените альфу, чтобы сказать .5, которая выделит кнопку. Если вам нужно выделить только определенные области, а не весь прямоугольник, используйте кварц и переопределите drawRect или создайте png с прозрачностью. – DevDevDev

0

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

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

Да, я подумал об этом уже ... На самом деле, я реализовал что-то подобное в другом приложении с помощью фотошопа с изображением и проверил над ним отметку, но проблема в том, что изображения для кнопок взяты с камеры, поэтому невозможно photoshop их на лету –

-1

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

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

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

+0

что такое 'eraserImageForSize'? что такое «радиус»? –

+0

eraserImageForSize - это метод в моем коде, который создает изображение для использования в качестве ластика, заданного радиуса - это не важно вне моего собственного кода. Важной частью является вызов setImage. Если вы предпочитаете, вот приведенный пример: [кнопка setImage: someImage forState: UIControlStateNormal] –

1

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

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

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

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

Я использовал это, чтобы вставить градиентные слои над фоном представления.

Смежные вопросы