Как я могу создать большой красный UIButton в iOS?

Используя iOS, как мне создать красную кнопку «удалить», аналогичную той, которая используется при удалении контактов на iPhone?


person igul222    schedule 15.09.2009    source источник
comment
Этот вопрос очень близок к вашему, и содержит несколько способов создания такой цветной кнопки.   -  person Brad Larson    schedule 15.09.2009
comment
Я сделал это недавно и создал для него эту кнопку (и некоторый пример кода Monotouch для любых монотушеров):! замещающий текст В нем меньше скоса, что лучше работает на любом фоне, но не совсем соответствует UIGlassButton iPhone.   -  person Chris S    schedule 08.03.2010
comment
Я добавил на свой сайт несколько изображений кнопок, доступных бесплатно по лицензии MIT, которые больше соответствуют стеклянным кнопкам iOS. (но этот форум не позволяет мне публиковать изображения, потому что я новичок) Чтобы загрузить их и образец кода, см .: Geneticmistakes.com/articles/1000/   -  person RicMoo    schedule 10.11.2010


Ответы (6)


Сначала вы начинаете с растягиваемого изображения:

http://grab.by/4lP

Затем вы делаете кнопку с растянутым изображением в качестве фона и применяете текст.

UIButton *sampleButton = [UIButton buttonWithType:UIButtonTypeCustom];
[sampleButton setFrame:CGRectMake(kLeftMargin, 10, self.view.bounds.size.width - kLeftMargin - kRightMargin, 52)];
[sampleButton setTitle:@"Button Title" forState:UIControlStateNormal];
[sampleButton setFont:[UIFont boldSystemFontOfSize:20]];
[sampleButton setBackgroundImage:[[UIImage imageNamed:@"redButton.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
[sampleButton addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:sampleButton];

Очевидно, вам нужно будет настроить начало и размер фрейма в соответствии с вашим приложением, а также цель, селектор и заголовок.

person coneybeare    schedule 15.09.2009
comment
Хорошее решение. Всего одно исправление кода: вы забыли знак @ для строки в - [UIImage imageNamed:]. - person Jonathan Sterling; 17.09.2009
comment
Примечание. Ответ на вопрос Энтони был дан здесь: stackoverflow.com / questions / 2276099 / a-big-green-uiimage-any / - person amphetamachine; 17.02.2010
comment
Отличный пост - спасибо за бесплатное изображение, буду им пользоваться :) - person Steve Neal; 17.07.2010
comment
Я считаю, что теперь это устарело, поскольку setFont для UIButton устарел. Тем не менее хороший ответ. - person Popeye; 15.03.2012
comment
stretchableImageWithLeftCapWidth:topCapHeight: также устарел в 5.0, в пользу resizableImageWithCapInsets:. - person Nate; 13.06.2012

Я также сделал несколько кнопок ... версии для сетчатки и без сетчатки

Если вы хотите использовать их в ячейке, просто используйте следующий код в cellForRowAtIndexPath:

UIButton *sampleButton = [UIButton buttonWithType:UIButtonTypeCustom];
[sampleButton setFrame:[cell.contentView frame]];
[sampleButton setFrame:CGRectMake(0, 0, cell.bounds.size.width-20, 44)];
[sampleButton setBackgroundImage:[UIImage imageNamed:@"button_red.png"] forState:UIControlStateNormal];
[cell addSubview:sampleButton];

Зеленая кнопка, нормальная

Красная кнопка в норме

Серая кнопка, нормальная

Зеленая кнопка RetinaRed Button Retina Серая кнопка Retina

person Staeff    schedule 23.11.2010
comment
У вас есть такие с прозрачным фоном? Когда я помещаю их в представление с небелым фоном, это выглядит странно ... понимаете, о чем я? - person Henley; 07.08.2011
comment
@Hisoka: sampleButton.alpha = 0,5; - person titaniumdecoy; 18.12.2011
comment
Очень хорошо. Они взяты из графического интерфейса iPhone? - person Matej; 01.09.2012

Я думаю, что эти лучше (и они тоже хорошо смотрятся на сетчатке):

alt textальтернативный текст

.png, созданный из этого очень красивого файла .psd: http://www.teehanlax.com/blog/2010/08/12/iphone-4-gui-psd-retina-display/

А затем используйте его как растягиваемое изображение для фона вашего UIButton:

UIImage* greenButton = [UIImage imageNamed:@"UIButton_green.png"]; 
UIImage *newImage = [greenButton stretchableImageWithLeftCapWidth:greenButton.size.width/2 topCapHeight:greenButton.size.height/2];
[callButton setBackgroundImage:newImage forState:UIControlStateNormal];

person yonel    schedule 09.09.2010
comment
Обратите внимание, что их использование в приложении нарушает исходную авторскую лицензию. - person Daniel Beck; 15.12.2012
comment
Обратите внимание, что срок действия ссылки истек, и вы получаете страницу, которая не найдена, очевидно, это не ваша вина, но я подумал, что вы могли бы обновить ссылку новой, если она у вас есть. - person Popeye; 02.05.2013

Вероятно, самый простой способ сделать это - найти этот файл Photoshop с графическим интерфейсом пользователя iPhone, содержащий множество элементов пользовательского интерфейса в слоях PSD, затем измените оттенок большой кнопки в Photoshop и сохраните ее как PNG.

Одним из преимуществ этого способа является то, что вы также можете создавать версии для выбранной кнопки и / или состояния выделения и назначать изображения стандартному UIButton.

person Ramin    schedule 15.09.2009
comment
один недостаток - вам нужно держать тонны больших изображений в вашем пакете, и они не умещаются на экране при другом повороте - person coneybeare; 15.09.2009

Вы можете создать отдельный раздел в представлении сгруппированной таблицы, присвоить этому разделу только одну строку и установить для фонового изображения этой ячейки изображение с красным градиентом. Однако вам придется воссоздать это изображение самостоятельно.

person Tim    schedule 15.09.2009
comment
хотя это работает, оно не настраивается, как мое представленное решение, так как для получения специальной подсветки или состояний вам потребуется реализовать настраиваемую логику, которую Apple уже включает в класс UIButton - person coneybeare; 15.09.2009

Я хотел бы внести свой вклад в решение, которое не использует изображения, но которое выглядит так же, как кнопка «Удалить» в Контактах. В приведенном ниже примере я буду использовать UITableView с сгруппированными статическими ячейками, созданными в раскадровке. Сделайте так, чтобы в одной из секций была только одна ячейка. Эта ячейка будет кнопкой «удалить». Придайте ячейке красный цвет фона (например, красный 221, зеленый 0, синий 2)

Что мы сделаем, так это добавим в ячейку два GradientLayer. Первый покроет верхнюю половину клетки. Вторая закроет нижнюю половину.

Добавьте QuartzCore в свой файл реализации:

#import <QuartzCore/QuartzCore.h>

Начнем с вывода в эту ячейку:

@property (strong, nonatomic) IBOutlet UITableViewCell *cellDelete;

Создайте метод форматирования ячейки:

- (void)formatCellDelete
{
    // Top Gradient //
    CAGradientLayer *gradientTop = [CAGradientLayer layer];

    // Make a frame for the layer based on the size of the cells contentView
    // Make it half the height
    // The width will be -20 so the gradient will not overflow
    CGRect frame = CGRectMake(0, 0, _cellDelete.contentView.frame.size.width - 20, _cellDelete.contentView.frame.size.height / 2);
    gradientTop.frame = frame;

    gradientTop.cornerRadius = 8;

    UIColor* topColor = [UIColor colorWithWhite:1.0f alpha:0.75f];
    UIColor* bottomColor = [UIColor colorWithWhite:1.0f alpha:0.0f];
    gradientTop.colors = [NSArray arrayWithObjects:(id)[topColor CGColor], (id)[bottomColor CGColor], nil];

    [_cellDelete.contentView.layer setMasksToBounds:YES];
    [_cellDelete.contentView.layer insertSublayer:gradientTop atIndex:0];



    // Bottom Gradient //
    CAGradientLayer *gradientBottom = [CAGradientLayer layer];

    // Make a frame for the layer based on the size of the cells contentView
    // Make it half the height
    // The width will be -20 so the gradient will not overflow
    frame = CGRectMake(0, 0, _cellDelete.contentView.frame.size.width - 20, _cellDelete.contentView.frame.size.height / 2);
    // And move to bottom
    frame.origin.y = frame.size.height;
    gradientBottom.frame = frame;

    topColor = [UIColor colorWithWhite:0.0f alpha:0.05f]; //0.20
    bottomColor = [UIColor colorWithWhite:0.0f alpha:0.0f];
    gradientBottom.colors = [NSArray arrayWithObjects:(id)[topColor CGColor], (id)[bottomColor CGColor], nil];

    [_cellDelete.contentView.layer setMasksToBounds:YES];
    [_cellDelete.contentView.layer insertSublayer:gradientBottom atIndex:0];


    // Define a selected-backgroundColor so the cell changes color when the user tabs it
    UIView *bgColorView = [[UIView alloc] init];
    [bgColorView setBackgroundColor:[UIColor colorWithRed:(float)(0.502) green:0.0 blue:0.0 alpha:1.000]];
    bgColorView.layer.cornerRadius = 10;
    [_cellDelete setSelectedBackgroundView:bgColorView];
}

Вышеупомянутое придаст вашей ячейке стеклянный вид, как кнопка «Удалить» в Контактах. Но мы также хотим, чтобы он менял цвет, когда пользователь нажимает на него. Это то, что будет делать последний фрагмент кода в приведенном выше методе. Он установит другой вид с более темным цветом в качестве selectedBackgroundView.

После нажатия ячейка останется выделенной и сохранит свой темный цвет. Чтобы автоматически снять выделение с ячейки, мы делаем следующее:

Начните с константы, которая определяет номер раздела вашей удаляемой ячейки:

static NSInteger const SECTION_DELETE = 1;

Теперь реализуйте метод (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath (определенный в UITableViewDelegate):

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    if(indexPath.section == SECTION_DELETE){

        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }


    // Navigation logic may go here. Create and push another view controller.
    /*
      *detailViewController = [[ alloc] initWithNibName:@"" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:detailViewController animated:YES];
     */

}
person Brabbeldas    schedule 28.03.2013