2012-02-20 17 views
5

Quando si tocca un UIBarButtonItem in un UIToolbar, c'è un effetto bagliore bianco.Come attivare l'effetto Hightlight su UIBarButtonItem

Esiste la possibilità di attivare un evento per mostrare questo effetto?

Non voglio premere il pulsante. Dovrebbe essere visualizzato solo l'effetto. Voglio visualizzare all'utente che ci sono nuovi contenuti dietro questo pulsante.

Grazie per il vostro aiuto!

risposta

2

Il seguente metodo presuppone che si stia utilizzando la proprietà toolbarItems di un controller di navigazione e che il pulsante che si desidera evidenziare sia l'ultimo elemento di tale array. È possibile applicarlo a qualsiasi barra degli strumenti, ovviamente, e selezionare un indice di array diverso se necessario.

In questo momento non è esattamente perfetto, perché l'animazione sposta il nuovo pulsante dalla parte inferiore sinistra dello schermo. Tuttavia, penso che possa essere disattivato con un piccolo sforzo.

Nota che ho usato l'immagine PeakJi.

Spero che questo funzioni per voi.

Godetevi,

Damien

- (void)highlightButton { 
    NSArray *originalFooterItems = self.toolbarItems; 
    NSMutableArray *footerItems = [originalFooterItems mutableCopy]; 
    [footerItems removeLastObject]; 

    NSString* pathToImageFile = [[NSBundle mainBundle] pathForResource:@"white_glow" ofType:@"png"]; 
    UIImage* anImage = [UIImage imageWithContentsOfFile:pathToImageFile]; 
    UIImageView *imageView = [[UIImageView alloc] initWithImage:anImage]; 
    imageView.frame = CGRectMake(0, 0, 40, 40); 

    UIBarButtonItem *flashImage = [[UIBarButtonItem alloc] initWithCustomView:imageView]; 
    [footerItems addObject:flashImage]; 

    [UIView animateWithDuration:0.3 
          delay: 0.0 
         options: UIViewAnimationOptionCurveEaseOut 
        animations:^{ 
         self.toolbarItems = footerItems;      } 
        completion:^(BOOL finished){ 
         [UIView animateWithDuration:.3 
               delay: 0.0 
              options:UIViewAnimationOptionCurveEaseIn 
              animations:^{ 
               self.toolbarItems = originalFooterItems; 
              } 
              completion:nil]; 
        }]; 
} 
1

Per gli elementi Bar

[(UIButton *)[[toolbarItems objectAtIndex:1] customView] setImage:[UIImage imageNamed:@"highlight.png"] forState:UIControlStateNormal]; 

In generale - Supponendo di avere un pulsante

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[button addTarget:self 
      action:@selector(someFunction:) 
forControlEvents:UIControlEventTouchDown]; 
[button setTitle:@"Click here" forState:UIControlStateNormal]; 
button.frame = CGRectMake(0.0, 0.0, 100.0, 40.0); 
[self.view addSubview:button]; 

è possibile in un qualsiasi punto, chiamare a livello di programmazione di questa funzione:

[button setTitle:@"Look Here" forState:UIControlStateNormal]; 

o se ti piace avere un'immagine highlight

btnImage = [UIImage imageNamed:@"highlight.png"]; 
[button setImage:btnImage forState:UIControlStateNormal]; 

Una semplice alternativa:

Detto questo, è anche possibile impostare il pulsante in questo modo:

- (void)highlightButton:(UIButton *)button { 
    [button setHighlighted:YES]; 
} 
+0

Grazie per la risposta! L'effetto bagliore bianco nella barra degli strumenti è predefinito nell'SDK di iOS, non ho alcun highlight.png e dovrei crearne uno. Non esiste altro modo per attivare l'effetto bagliore bianco predefinito? – Manni

+0

@Manni Ho appena fatto un highlight.png per te, LOL – PeakJi

4

Heres il "highlight.png", non sto scherzando! (Anche se non puoi vederlo su uno sfondo bianco.)

highlight.png screenshot

+8

Posso confermare che non sta scherzando :) –

1

Si può cercare di ricreare un nuovo elemento pulsante della barra con stile diverso, e poi riassegnare indietro. Il mio esperimento è stato:

In viewDidLoad:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIBarButtonItem *rightBtn = [[UIBarButtonItem alloc] initWithTitle:@"Custom" 
                   style:UIBarButtonItemStylePlain 
                   target:self 
                   action:nil]; 
    self.navigationItem.rightBarButtonItem = rightBtn; 
    [rightBtn release]; 

    [self performSelector:@selector(highlight) 
       withObject:nil 
       afterDelay:2.0]; 
} 

E nel metodo clou:

- (void) highlight{ 
    UIBarButtonItem *rightBtn = [[UIBarButtonItem alloc] initWithTitle:@"Custom" 
                   style:UIBarButtonItemStyleDone 
                   target:self 
                   action:nil]; 
    self.navigationItem.rightBarButtonItem = rightBtn; 
    [rightBtn release]; 
} 

L'implementazione potrebbe essere diverso dal mio, ma finché si sta bene con la riassegnazione il pulsante della barra , Penso che funzionerà come previsto. Buona fortuna :)

0

Un semplice ay è a init vostro UIBarButtonItem con un CustomView (UIButton)

UIButton *favButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[favButton setFrame:CGRectMake(0.0, 100.0, 50.0, 30.0)]; 
[favButton setBackgroundImage:[UIImage imageNamed:@"bouton_black_normal.png"] 
      forState:UIControlStateNormal]; 
[favButton setBackgroundImage:[UIImage imageNamed:@"bouton_black_hightlight.png"] 
      forState:UIControlStateHighlighted]; 
[favButton setTitle:@"Add" forState:UIControlStateNormal]; 
[favButton setTitle:@"Add" forState:UIControlStateHighlighted]; 
[favButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
[favButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted]; 
[[favButton titleLabel] setFont:[UIFont boldSystemFontOfSize:13]]; 
[favButton addTarget:self action:@selector(doSomething) 
    forControlEvents:UIControlEventTouchUpInside]; 

UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithCustomView:favButton]; 
1

Se si dispone di una categoria:

#define HIGHLIGHT_TIME 0.5f 

@interface UIButton (Highlight) 
- (void)highlight; 
@end 

@implementation UIButton (Highlight) 

- (void)highlight { 
    UIButton *overlayButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    overlayButton.frame = self.frame; 
    overlayButton.showsTouchWhenHighlighted = YES; 
    [self.superview addSubview:overlayButton]; 
    overlayButton.highlighted = YES; 
    [self performSelector:@selector(hideOverlayButton:) withObject:overlayButton afterDelay:HIGHLIGHT_TIME]; 
} 

- (void)hideOverlayButton:(UIButton *)overlayButton { 
    overlayButton.highlighted = NO; 
    [overlayButton removeFromSuperview]; 
} 

@end 

allora avete bisogno di codice come questo ...

UIBarButtonItem *addButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)] autorelease]; 
self.navigationItem.rightBarButtonItem = addButton; 
[self.navigationController.navigationBar.subviews.lastObject performSelector:@selector(highlight) withObject:nil afterDelay:2]; 

... per evidenziare il pulsante nella barra di navigazione dopo 2 secondi.

Problemi correlati