2010-09-09 10 views
7

Necesito generar un botón personalizado a través del código, así es como lo estoy haciendo actualmente.Haciendo un botón personalizado usando UIView o reemplazando UIButton?

-(void) initialiseButtons 
{ 
    int ypos = playerImage.frame.origin.y + playerImage.frame.size.height + 8; 
    for(int i=0; i<totalButtons; i++) 
    {  
     UIButton *newButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
     [newButton setFrame:CGRectMake(20, ypos, 220, 30)]; 
     newButton.tag = 10 + i; 
     [newButton addTarget:self action:@selector(statTapped:) forControlEvents:UIControlEventTouchUpInside]; 
     [self.frontView addSubview:newButton]; 
     ypos += 30 + 7; 
    } 
} 

Esto crea los botones en blanco a la perfección a través de código, les da una etiqueta y asigna una función de devolución de llamada en touchUpInside.

El botón personalizado debe poder mostrar una imagen cuando se presiona hacia abajo. Necesita poder dibujar 2 pedazos de texto. 1 alineado al lado izquierdo del botón y 1 alineado al lado derecho del botón.

Mi jefe sugirió en lugar de botones que use una Vista. No entiendo cómo funcionará esto. Cuando empiece a pensar en ello, creo que requeriría tener un viewcontroller dedicado a los botones. ¿Y algún método de dibujar? Suena complicado y no entiendo cómo se puede hacer.

¿Hay un método más simple haciendo que una clase personalizada anule UIButton? Hice una clase de prueba simple antes, pero no se dibujó nada en las ubicaciones de los botones cuando las usé en lugar de la clase UIButton Normal. Esperaba ver el buttonUp.png dibujado.

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

@interface CardButton : UIButton { 
} 
@end 


#import "CardButton.h" 
#import <UIKit/UIKit.h> 
@implementation CardButton 
- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) 
    { 
     [self setImage:[UIImage imageNamed:@"buttonUp.png"] forStates:UIControlStateNormal]; 
     self.adjustsImageWhenHighlighted = YES; 
    } 
    return self; 
} 
@end 

¿Alguien me puede dar algunos consejos sobre esto? Estoy bastante bloqueado en este momento. He estado leyendo algunos otros hilos relacionados con los botones, pero nada que haya dejado claro en mi cabeza cómo abordar el problema

Respuesta

2

No debería (casi diría que no se puede) la subclase UIButton, ya que resulta ser un grupo de clases, y sería poco práctico (leer: imposible) derivar de eso.

Así que sus dos opciones son:

1) uso estándar UIButton de tipo personalizado, añadir los elementos que desea mostrar (es decir UILabel) y conectar las acciones de contacto hacia abajo y retocar y reaccionar en consecuencia (cambiar la vistas, desencadenar acciones, etc.)

2) Use un UIView personalizado, implemente drawRect: para dibujar cómo le gusta o use vistas personalizadas como subvistas como en 1). Luego use los mensajes touchesBegan:, touchesEnded: etc. para reaccionar en consecuencia (o UIGestureRecognizer si puede vivir con la compatibilidad 3.2+).

Puede construir una fábrica para construir esos botones si todos son muy similares, para que su código se vuelva limpio y no repetitivo.

Editar según iOS 6: Apple ahora menciona la subclasificación en la documentación UIButton, por lo que al mismo tiempo no muy bien definido, parece bastante seguro ahora para hacerlo.

+0

CAnt averiguar cómo hacer esto. Lo dejaré 24 horas y veré si tiene más sentido cuando regrese a él. Gracias por la ayuda que Eiko apreció :) –

+0

¿Puede darnos más información sobre esta cosa de la fábrica? –

+0

@Lechazar Todorov Simplemente haga un método de clase (estático) * en algún lugar * que cree y configure el botón. De esta forma, puedes crear tantos botones de este tipo como quieras, pero no tienes que jugar con la desalentada subclasificación. – Eiko

1

Una manera fácil de hacer esto, es anular una UIView. En la vista, agrega un UIButton como Subvista. De esta forma, tiene una clase reutilizable sin la necesidad de volver a implementar el comportamiento del botón.

Puede diseñar su botón de la forma que desee en el método initWithFrame de su clase derivada de UIView. Si usa esta clase como destino para sus eventos de botón, puede implementar un comportamiento especial fácilmente, como mostrar la imagen.

Para las dos piezas de texto, crea dos etiquetas y las agrega como subvistas al botón.

6

Personalmente, yo subclase UIButton. A pesar de toda la charla de que no se puede subclase UIButton, Apple incluso habla de subclasificar UIButton en la documentación de UIButton.

En la subclase, crearía una UIView con las dos etiquetas (o imágenes o lo que sea) y las agregaría como subvistas al botón (asegúrese de establecer el texto interactivo y ver como FALSO).

Lo sorprendente de esto es que aprovecha el código UIButton y evita que reinvente la rueda.

+0

BTW, la documentación para UIButton incluso habla de subclasificarlo. No es un clúster de clase o un objeto abstracto. Subclases está perfectamente bien. –

+0

Y solo un FYI porque Eiko lo menciona, no puede cambiar el buttonType programáticamente; solo puede hacerlo en IB. Esto no debería ser un problema para la mayoría de los desarrolladores. –

+0

UIButton NO es un clúster de clase. La documentación de Apple señala claramente qué es un clúster de clase (NSArray es un clúster de clase, por ejemplo). Confiaría en la documentación de Apple y no en los rumores. –

Cuestiones relacionadas