2013-06-07 9 views
7

Sto tentando di creare un UIBarbuttonItem personalizzato che utilizza solo un png con trasparenza in modo che abbia solo un'icona come pulsante. Quando provo a impostare l'immagine del pulsante, lo sfondo è bianco e lo stile su Plain, ho ancora un'ombra interna e un bordo nero attorno ad esso.Custom UIBarButtonItem

Cosa dà?

enter image description here

Ho provato il codice qui sotto e si mette ancora il bordo nero intorno ad esso.

UIImage *background = [UIImage imageNamed:@"Dismiss_normal.png"]; 
UIImage *backgroundSelected = [UIImage imageNamed:@"Dismiss_selected.png"]; 
self.closeButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[self.closeButton addTarget:self action:@selector(closeButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; //adding action 
[self.closeButton setBackgroundImage:background forState:UIControlStateNormal]; 
[self.closeButton setBackgroundImage:backgroundSelected forState:UIControlStateSelected]; 
self.closeButton.frame = CGRectMake(0 ,0,background.size.width, background.size.height); 
self.closeButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.closeButton]; 
self.navigationItem.leftBarButtonItem = self.closeButtonItem; 

Quello che ho notato è che se faccio un segue modal il pulsante, con il codice di cui sopra ha ancora un bordo nero attorno ad esso, ma se faccio una spinta segue che non lo fa? WTF?

risposta

7

Ho capito il tuo problema.

Quando si spinge effettivamente un UIViewController sarà una parte di esistente UINavigationController. Quindi lo UINavigationBar conserva. Ma quando si utilizza ModalViewController è solo un altro UIViewController tipo di "aggiunto" al tuo esistente UIViewController. Quindi lo UINavigationBar non sarà lì.

Ma è possibile aggiungere un altro UINavigationBar da xib e aggiungere un UIButton. Ma non aggiungere direttamente lo UIButton, se lo fai si convertirà automaticamente in UIBarButton facendolo bordare.

Quindi trascinare prima un normale UIButton sul UIView (non sulla barra di spostamento). Passa a custom e aggiungi UIImage usando Attribute Inspector. Quindi trascina l'immagine sul tuo oggetto personalizzato creato UINavigationBar. Funzionerà come ho provato solo ora. Puoi vedere la schermata allegata di seguito.

enter image description here

+0

In realtà non è possibile accedere alla barra di navigazione dal controller della vista presentato in modo modale. Quindi devi aggiungere la tua UINavigationBar (personalizzata). –

+0

Sono stato seguito per i passaggi ... Questo tipo di azione del pulsante non funziona @property (debole, non anatomico) IBOutlet UIBarButtonItem * sidebarButton; dare azione Outlet, ma l'azione del pulsante non funziona – San

2

uso Try [UIBarButtonItem initWithCustomView]

UIImage *menuButtonImage = [UIImage imageNamed:@"list.png"];// set your image Name here 
UIButton *btnToggle = [UIButton buttonWithType:UIButtonTypeCustom]; 
[btnToggle setImage:menuButtonImage forState:UIControlStateNormal]; 
btnToggle.frame = CGRectMake(0, 0, menuButtonImage.size.width, menuButtonImage.size.height); 
UIBarButtonItem *menuBarButton = [[UIBarButtonItem alloc] initWithCustomView:btnToggle]; 
self.navigationItem.leftBarButtonItem = menuBarButton; 
0

provare questo codice ..

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *btnImage = [UIImage imageNamed:@"bg"]; 
[button setImage:btnImage forState:UIControlStateNormal]; 
button.frame = CGRectMake(0, 0, btnImage.size.width, btnImage.size.height); 
[button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; 
UIImage *icon = [UIImage imageNamed:@"icon"] 
UIImageView *iconView = [[UIImageView alloc] initWithImage:icon]; 
iconView.frame = CGRectMake(0, 0, icon.size.width, icon.size.height); 
[button addSubview:iconView]; 
iconView..userInteractionEnabled=NO; 
[iconView centerBothDirections]; 
[iconView release]; 
UIBarButtonItem *barbtn = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease]; 
self.navigationItem.leftBarButtonItem =barbtn 
15

È necessario impostare il tipo di pulsante per personalizzato e l'immagine icona sul pulsante sfondo. esempio di codice:

UIImage *background = [UIImage imageNamed:@"icon.png"]; 
UIImage *backgroundSelected = [UIImage imageNamed:@"icon_selected.png"]; 
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
[button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; //adding action 
[button setBackgroundImage:background forState:UIControlStateNormal]; 
[button setBackgroundImage:backgroundSelected forState:UIControlStateSelected]; 
button.frame = CGRectMake(0 ,0,35,35); 

Poi impostare questo pulsante per la vostra BarButtonItem in questo modo:

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button]; 
self.navigationItem.leftBarButtonItem = barButton; 
+1

si vuole fare in modo che l'utente non ha alcun problema toccando il pulsante, con che si dovrebbe allocare un nuovo UIView con i confini che si desidera essere in grado di toccare, quindi aggiungere il pulsante per questo punto di vista quindi avviare il barButton con la nuova vista allocata invece –

1

Personalmente, come FlatUIKit's approccio semplicemente appiattendo l'intera interfaccia utente attraverso UIAppearance

In sostanza, si' d fare qualcosa come:

UIImage *backButtonPortraitImage = [UIImage backButtonImageWithColor:color barMetrics:UIBarMetricsDefault cornerRadius:cornerRadius]; 
UIImage *highlightedBackButtonPortraitImage = [UIImage backButtonImageWithColor:highlightedColor barMetrics:UIBarMetricsDefault cornerRadius:cornerRadius]; 

[appearance setBackButtonBackgroundImage:backButtonPortraitImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[appearance setBackButtonBackgroundImage:highlightedBackButtonPortraitImage forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 

UIImage *buttonImageNormal  = [UIImage imageWithColor:color cornerRadius:cornerRadius]; 
UIImage *buttonImageHightlighted = [UIImage imageWithColor:highlightedColor cornerRadius:cornerRadius]; 

[appearance setBackgroundImage:buttonImageNormal forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[appearance setBackgroundImage:buttonImageHightlighted forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 
4

Questo aggiornerà TUTTI i pulsanti posteriori e le barre di navigazione in tutta l'app.

Ho usato il seguente codice per impostare il pulsante

UIImage *imgBack = [[UIImage imageNamed:@"nav_back.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(-6, 22, -6, 0)]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:imgBack forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

e il seguente codice per un'immagine di sfondo Impostazione sulla barra di navigazione di navigazione personalizzata indietro.

UIImage *navBackgroundImage = [UIImage imageNamed:@"nav_bar.png"]; 
[[UINavigationBar appearance] setBackgroundImage:navBackgroundImage forBarMetrics:UIBarMetricsDefault]; 
+1

Vale la pena spiegare che questo aggiornerà TUTTI i pulsanti Indietro e le barre di navigazione in tutta l'app, probabilmente la migliore risposta. –

+0

sottocategoria UINavigationController e modificare la barra di navigazione e utilizzare la sottoclasse come strumento di navigazione principale, –