2009-03-12 6 views
11

Todos los ejemplos que he visto aquí y en otros sitios a participar, creando un UIActivityIndicatorView y lo carga con algo como:¿Cómo puedo crear un botón con un UIActivityIndicator en mi barra de navegación con el mismo estilo que los botones normales?

self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] 
        initWithCustomView:myActivityIndicatorView 
        target:nil 
        action:nil] 
        autorelease]; 

Sin embargo, eso sólo crea un indicador de actividad normal en la barra de navegación. Lo que quiero hacer es tener un botón que se parezca a los botones UIBarButtonSystemItem normales, pero con un indicador de actividad en lugar de una de las imágenes predeterminadas. Intenté hacer initWithImage e initWithTitle con imágenes o títulos nulos y luego agregar el indicador de actividad como subvista, pero eso no funciona.

¿Alguna idea?

Respuesta

1

¿Ha intentado crear un UIButton en la barra de botones y luego agregar un indicador de actividad como subvista del UIButton?

+0

Lo intenté, pero parecía que no podía hacerlo funcionar. –

1

Tengo esto funcionando y es muy simple. Simplemente coloque el indicador de actividad donde lo desee con IB, pero asegúrese de que esté más abajo en la lista que la barra en la que lo desea, y que esté en el "nivel superior" (no en una subvista de otra cosa). Luego, controle el código a través de una toma de corriente.

1

Aquí hay algo que puede ayudar:

activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; 
[activityIndicator startAnimating]; 
UIBarButtonItem *activityItem = [[UIBarButtonItem alloc] initWithCustomView:activityIndicator]; 
[activityIndicator release]; 
self.navigationItem.rightBarButtonItem = activityItem; 
[activityItem release]; 
[activityIndicator startAnimating]; 
+0

2 veces [activityIndicator startAnimating]; – user930195

6

Mi solución es crear una subclase de UIButton:

en SOActivityButton.h:

@interface SOActivityButton : UIButton 
{ 
UIActivityIndicatorView* activityIndicator; 
} 
@end 

en SOActivityButton.m:

@implementation SOActivityButton 

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) 
    { 
     CGRect innerFrame = CGRectInset(frame, 8.0f, 8.0f); 
     activityIndicator = [[UIActivityIndicatorView alloc] 
            initWithFrame:innerFrame]; 
     activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite; 
     [self addSubview:activityIndicator]; 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [activityIndicator release], activityIndicator = nil; 
    [super dealloc]; 
} 

- (void) startAnimating 
{ 
    [activityIndicator startAnimating]; 
} 

- (void) stopAnimating 
{ 
    [activityIndicator stopAnimating]; 
} 
@end 

después utilizarla:

SOActivityButton* activityButton = [[SOActivityButton alloc] 
        initWithFrame:CGRectMake(0.0f, 0.0f, 32.0f, 32.0f)]; 
[activityButton setImage:[UIImage imageNamed:@"button-background.png"] 
        forState:UIControlStateNormal]; 
[activityButton addTarget:self action:@selector(myAction:) 
        forControlEvents:UIControlEventTouchUpInside]; 
UIBarButtonItem *activityBarButtonItem = [[UIBarButtonItem alloc] 
        initWithCustomView:activityButton]; 
[activityButton release]; 
self.navigationItem.rightBarButtonItem = activityBarButtonItem; 
[activityBarButtonItem release]; 

Usted tendrá que encontrar o crear un botón de -background.png. El PSD here debe tener uno.

+0

Hum, un UIBarButtonItem no es un UIButton, por lo que su enfoque de "subclase" se debe aplicar más a un UIBarButtonItem directamente en ese caso. – yonel

+0

No realmente, ya que UIBarButtonItem no le da acceso fácil a su jerarquía de Vista. Aún tendrá que crear sus propias Vistas para reemplazar el CustomView de UIBarButtonItem, no hay mucho más que subclasificar UIBarButtonItem para hacer eso. –

+0

Esto es una pena que no haya sido aceptado como una respuesta. Gracias – Nick

Cuestiones relacionadas