3

J'ai ajouté une instance de UIToolbar et des boutons dessus. Chaque bouton appartient à la classe de UIBarButtonItem.Personnaliser UIBarbuttonitem avec des images d'arrière-plan

Mon exigence est que chaque bouton a une disposition personnalisée, je ne veux pas utiliser les styles de boutons natifs fournis par Apple. J'ai donc eu 3 options dans Interface Builder (Plain, Bordered, Done). J'ai sélectionné le style Plain et sélectionné l'image que je veux ajouter en backgroun sous Élément de barre -> Image.

Mais cela n'a pas fonctionné pour moi, en utilisant l'option plaine me rapproche un peu plus comme frontière et fait ne sont nulle part plus près mais encore il affiche les images dans le contour blanc. Y at-il de toute façon que les images sur les boutons sont ajoutés et ils ressemblent exactement comme ils sont. C'est une tâche assez simple lors de l'utilisation de UIButton. Je viens d'utiliser l'option Image dans l'inspecteur Attributs pour UIButton et sélectionnez l'image que je veux. Mais ici, tout en utilisant UIBarButtonitem ça ne marche pas du tout. Voici comment il affiche

Merci Taimur

Répondre

24

Taimur,

je suis tombé sur le même problème que vous frapper. Notre concepteur a spécifié un aspect personnalisé pour les boutons dans la barre de navigation de notre application. Voici une méthode utilitaire que j'ai écrit pour générer les UIBarButtonItems que nous avions besoin, vous devriez être en mesure de le modifier selon vos besoins:

+ (UIBarButtonItem *)createSquareBarButtonItemWithTitle:(NSString *)t target:(id)tgt action:(SEL)a 
{ 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    // Since the buttons can be any width we use a thin image with a stretchable center point 
    UIImage *buttonImage = [[UIImage imageNamed:@"SquareButton.png"] stretchableImageWithLeftCapWidth:5 topCapHeight:0]; 
    UIImage *buttonPressedImage = [[UIImage imageNamed:@"SquareButton_pressed.png"] stretchableImageWithLeftCapWidth:5 topCapHeight:0]; 

    [[button titleLabel] setFont:[UIFont boldSystemFontOfSize:12.0]]; 
    [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 
    [button setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted]; 
    [button setTitleShadowColor:[UIColor colorWithWhite:1.0 alpha:0.7] forState:UIControlStateNormal]; 
    [button setTitleShadowColor:[UIColor clearColor] forState:UIControlStateHighlighted]; 
    [[button titleLabel] setShadowOffset:CGSizeMake(0.0, 1.0)]; 

    CGRect buttonFrame = [button frame]; 
    buttonFrame.size.width = [t sizeWithFont:[UIFont boldSystemFontOfSize:12.0]].width + 24.0; 
    buttonFrame.size.height = buttonImage.size.height; 
    [button setFrame:buttonFrame]; 

    [button setBackgroundImage:buttonImage forState:UIControlStateNormal]; 
    [button setBackgroundImage:buttonPressedImage forState:UIControlStateHighlighted]; 

    [button setTitle:t forState:UIControlStateNormal]; 

    [button addTarget:tgt action:a forControlEvents:UIControlEventTouchUpInside]; 

    UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 

    return [buttonItem autorelease]; 
} 
+0

Merci beaucoup J'ai juste essayé d'utiliser votre code et il s'est écrasé à l'exécution c'est comment je l'appelle. UIBarButtonItem * HomeButton = [self createSquareBarButtonItemWithTitle: @ Cible "Home": action de soi: @selector (pressHomeButton :)]; –

+0

J'ai écrit le code entier dans la même fucntion. et ça marche maintenant. Mauvaise programmation car je dois copier le code 5 fois et le coller dans la même fonction. Mais l'application s'est écrasée quand j'ai appelé la fonction. Veuillez me guider si je fais une erreur en appelant la fonction. –

+0

Il s'est écrasé parce que c'est une méthode de classe (notez le '+' devant lui), et vous l'appelez sur une instance. L'appel doit être 'UIBarButtonItem * HomeButton = [[self class] createSquareBarButtonItemWithTitle: @ Cible" Home ": action de soi: @selector (appuyez surHomeButton :)];'. Ou, si vous l'appelez d'ailleurs, mettez simplement le nom de la classe au lieu de '[self class]'. –

3

Le problème ici est que UIBarButtonItem est pas un UIView-subclass. J'ai eu le même problème aussi, et la solution est tout à fait trivial:

Créer un objet UIButton avec votre image de fond personnalisée, créez ensuite une instance d'un UIBarButtonItem utilisant sa méthode initWithCustomView: et passer votre objet UIButton comme paramètre.

J'espère que je pourrais vous aider.

+0

merci mec, malheureusement l'application plantée UIButton * BackButton = [UIButton alloc]; [BackButton setImage: [UIImage imageNamed: @ "Home_icon.png"] forState: UIControlStateNormal]; \t UIBarButtonItem * homebutton = [[UIBarButtonItem alloc] initWithCustomView: cible BackButton: self Action: @selector (pressHomeButton :)]; –

+0

hmmm c'est à peu près ce que je fais aussi bien. avez-vous une sortie de console pour moi? – samsam

+0

@TaimurAjmal Eh bien, vous n'avez peut-être pas appelé la méthode init?UIButton * BackButton = [[UIButton alloc] init]; – igrek

2

glisser-déposer un UIButton sur côté du UIToolbar dans IB puis formatez et attribuer les sélecteurs et faites-le glisser dans UIToolBar.,. ,, Cela a fonctionné pour moi !!

+0

Cela fonctionne parfaitement! –

0

J'ai eu le même problème avec un UIBarButton dans la barre de navigation. J'ai utilisé la solution proposée par kaar3k. Merci kaar3k. Glissez et déposez un UIButton à l'extérieur du NavBar dans Storybaord, puis formatez-le et affectez les sélecteurs et faites-le glisser sur la NavBar !!