2009-09-15 19 views
53

Con el SDK de iPhone, ¿cómo podría crear un botón rojo "eliminar" similar al que se usa al eliminar contactos en el iPhone?¿Cómo puedo crear un UIButton grande y rojo con el SDK de iPhone?

+0

[Esta pregunta] (http://stackoverflow.com/questions/372731/how-can-i-set-a-button-background-color-on-iphone) está muy cerca de la suya, y contiene un par de formas de generar un botón de ese color –

+2

Aquí están todos los activos integrados de iOS: https://github.com/pixelfreak/iOS-UI-Assets – pixelfreak

Respuesta

85

Lo que empieza con una imagen estirable:

alt text http://grab.by/4lP

luego de hacer un botón con la imagen estirada como fondo y aplicar texto.

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

Obviamente, tendrá que ajustar el origen del marco y el tamaño para adaptarse a su aplicación, así como el blanco, el selector, y el título.

+0

Buena solución. Solo una corrección de código: olvidaste el @ -sign para la cadena en - [UIImage imageNamed:]. –

+0

Nota: la pregunta de Anthony fue respondida aquí: http: // stackoverflow.com/questions/2276099/a-big-green-uiimage-anyone/2276272 – amphetamachine

+0

Excelente publicación - gracias por la imagen gratuita, la usaré :) –

0

Puede crear una sección separada en la vista de tabla agrupada, otorgar a esa sección solo una fila y establecer la imagen de fondo de esa celda en una imagen de degradado roja. Sin embargo, tendrás que recrear esa imagen por tu cuenta.

+0

mientras esto funciona, no es una solución personalizable como la que presenté para obtener estados o resaltado especiales, Tendría que implementar una lógica personalizada que Apple ya incluye en la clase UIButton – coneybeare

2

Probablemente la forma más sencilla de hacerlo es enganchar this iPhone GUI Photoshop file que contiene muchos elementos de UI en capas de PSD, luego cambie el tinte del botón grande en Photoshop y guárdelo como PNG.

Una ventaja de hacerlo de esta manera es que también puede crear versiones para el botón seleccionado y/o resaltar el estado y asignar las imágenes a un UIButton estándar.

+0

una desventaja es que necesita mantener toneladas de imágenes grandes en su paquete, y no se ajustarán a la pantalla en una rotación diferente – coneybeare

22

Creo que esas son las mejores (y que se ven bien en la pantalla de la retina también):

alt text alt text

.png generarse de este muy buen archivo .psd: http://www.teehanlax.com/blog/2010/08/12/iphone-4-gui-psd-retina-display/

Y luego úselo como una imagen stretchable para el fondo de su 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]; 

+0

Nota que el uso de estos en una aplicación viola la licencia del autor original. –

+1

Tenga en cuenta que el enlace ha expirado y obtiene una "página no encontrada", obviamente esto no es su culpa, pero pensé que podría actualizar el enlace con uno nuevo si tiene uno. – Popeye

4

Para facilitar cualquier color, he creado mi propio renderizado para UIButton que le permite establecer un tinte personalizado.

Para los interesados, que se puede encontrar en GitHub en

https://github.com/appsinyourpants/Pants-Framework/blob/master/Classes/Views/PFTintedButton.m

+0

Lo tengo agregado, pero ¿cómo creo un PFTintedButton, lo uso como lo haría con un UIButton y llamo a PFTintedButton buttonWithType o hay algo especial que debería hacer? Supongo que lo que estoy preguntando es si tienes un ejemplo de cómo crear un PFTintedButton con opciones disponibles. Si tienes tiempo, me encantaría un ejemplo. –

63

También he hecho algunos botones. ..retina y versiones que no son de retina

Si desea utilizarlos en una celda sólo tiene que utilizar el siguiente código en 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]; 

Green Button Normal

Red Button Normal

Grey Button Normal

Green Button Retina Red Button Retina Grey Button Retina

+1

¿Tiene alguno de estos con un fondo transparente? Cuando los puse en una vista con un fondo no blanco, se ve complicado ... ¿sabes a qué me refiero? –

+2

@Hisoka: sampleButton.alpha = 0.5; – titaniumdecoy

+0

Muy agradable. ¿Se toman estos de la GUI de iPhone? –

0

Me gustaría aportar una solución que no utilice imágenes pero que tenga el mismo aspecto que el botón 'eliminar' en Contactos. En el siguiente ejemplo usaré una UITableView con agrupada, celdas estáticas, diseñadas en guiones gráficos. Haga que una de las secciones tenga solo una celda. Esa celda será el botón 'eliminar'. Proporcione a la celda un color de fondo rojo (por ejemplo, Rojo 221, Verde 0, Azul 2)

Lo que haremos es agregar dos GradientLayers a la celda. El primero cubrirá la mitad superior de la celda. El segundo cubrirá la mitad inferior.

Añadir QuartzCore a su archivo de aplicación:

#import <QuartzCore/QuartzCore.h> 

de inicio con la fabricación de una salida a esta celda:

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

crear un método en el que se dará formato de la celda:

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

Lo anterior le dará a su celda el aspecto del cristal como el botón 'eliminar' en Contactos. Pero también queremos que cambie de color cuando el usuario lo toque. Esto es lo que hará la última pieza de código en el método anterior. Establecerá una vista diferente con un color más oscuro como selectedBackgroundView.

Después de tocar la celda, permanecerá seleccionada y mantendrá su color oscuro. Para anular la selección automática de la célula hacemos lo siguiente:

de inicio con una constante que define la sección nr de la celda de borrado:

static NSInteger const SECTION_DELETE = 1; 

Ahora implementar el método (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath (definido en 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]; 
    */ 

} 
Cuestiones relacionadas