UIButton не показывает подсветку при касании

Я пытаюсь выделить свой UIButton с помощью пользовательского UIColor светло-серого цвета и сделать текст белым. Однако я не уверен, как это сделать; Вот как далеко я продвинулся в создании UIButton.

cancelButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    cancelButton.frame = CGRectMake(10.0, calculatorView.frame.size.height-55, 100.0, 45.0);
    [cancelButton addTarget:self action:@selector(calculateMethod:)forControlEvents:UIControlEventTouchDown];
    [[cancelButton titleLabel] setFont:[UIFont fontWithName: @"Super-text" size:20.0]];
    [cancelButton setTitle:@"Cancel" forState:UIControlStateNormal];

Ответ 1

Чтобы получить белый текст на подсветке, просто выполните:

[cancelButton setTitleColor:[UIColor whiteColor]
                       forState:UIControlStateHighlighted];

Чтобы получить фон для изменения, вам нужно либо выполнить setBackgroundImage: forState: и использовать UIImage с цветом шаблона или подкласса UIButton и установить соответствующий цвет фона в методе setHighlight:.

EDIT: версия Swift 2.x

cancelButton.setTitleColor(.whiteColor(), forState: Highlighted)

EDIT: версия Swift 3.0

cancelButton.setTitleColor(.white, for: .highlighted)

Ответ 2

Вы можете создать изображение, чтобы заполнить фон цветом.

[cancelButton setBackgroundImage:[self setBackgroundImageByColor:[UIColor blueColor] withFrame:cancelButton.frame cornerRadius:0] forState:UIControlStateHighlighted];
[cancelButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];

Этот метод создает изображение размера кнопки с прочным фоном цвета backgroundColor.

-(UIImage *)setBackgroundImageByColor:(UIColor *)backgroundColor withFrame:(CGRect )rect cornerRadius:(float)radius{

    UIView *tcv = [[UIView alloc] initWithFrame:rect];
    [tcv setBackgroundColor:backgroundColor];

    CGSize gcSize = tcv.frame.size;
    UIGraphicsBeginImageContext(gcSize);
    [tcv.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
    const CGRect RECT = CGRectMake(0, 0, image.size.width, image.size.height);;
    [[UIBezierPath bezierPathWithRoundedRect:RECT cornerRadius:radius] addClip];
    [image drawInRect:RECT];
    UIImage* imageNew = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return imageNew;
}

Ответ 3

Я знаю, что вам нужен белый цвет подсветки, но для всех, кому не важно, какой именно цвет подсветки, просто переключите тип кнопки на Систему (в Инспекторе атрибутов). Приятно то, что вы все еще можете использовать пользовательские шрифты, цвета и т.д.

Ответ 4

Используйте titleColor: forState:, чтобы установить цвет текста при выборе/выделить/отключить для соответствующего состояния.

Ответ 5

Ответ @nitin kachhadiya очень хорош, но я его подделал, упростил и сделал его категорией UIButton. Добавьте эти два файла в свой проект. Затем выберите цвет, который вы хотите установить:

[button setHighlightedColor:[UIColor blueColor]];

UIButton + FJHighlighted.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface UIButton (FJHighlighted)

- (void)setHighlightedColor:(UIColor *)highlightColor;

@end

UIButton + FJHighlighted.m

#import "UIButton+FJHighlighted.h"

@implementation UIButton (FJHighlighted)

- (void)setHighlightedColor:(UIColor *)highlightColor {
    [self setBackgroundImage:[self setBackgroundImageByColor:highlightColor cornerRadius:0]
                    forState:UIControlStateHighlighted];
    [self setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
}

- (UIImage *)setBackgroundImageByColor:(UIColor *)backgroundColor cornerRadius:(float)radius {
    UIView *tcv = [[UIView alloc] initWithFrame:self.frame];
    [tcv setBackgroundColor:backgroundColor];

    CGSize gcSize = tcv.frame.size;
    UIGraphicsBeginImageContext(gcSize);
    [tcv.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
    const CGRect RECT = CGRectMake(0, 0, image.size.width, image.size.height);;
    [[UIBezierPath bezierPathWithRoundedRect:RECT cornerRadius:radius] addClip];
    [image drawInRect:RECT];
    UIImage *imageNew = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return imageNew;
}

@end