web-dev-qa-db-fra.com

Modifier par programme le titre de UIButton dont le titre a été défini dans IB comme attribué

J'ai changé les titres de UIButtons avant d'utiliser:

- (void)setTitle:(NSString *)title forState:(UIControlState)state

Mais j'ai rencontré une situation où le UIButton que j'utilise a un titre sur plusieurs lignes et ne centrera le texte correctement que s'il est changé de "ordinaire" à "attribué" dans IB. Lorsque le titre est modifié de cette manière, la méthode habituelle setTitle: forState: Ne met plus à jour le bouton.

Comment apporter des modifications à un titre attribué d'un UIButton?

Pour clarifier, donc vous ne supposez pas que je fais juste une erreur stupide, j'ai utilisé le débogueur pour jeter un œil aux propriétés de UIButton et enregistrer la sortie de

- (NSString *)titleForState:(UIControlState)state

après avoir utilisé

- (void)setTitle:(NSString *)title forState:(UIControlState)state

pour le définir, il renvoie la valeur qui vient d'être définie. Le problème est qu'il ne change pas l'apparence du bouton tant que le titre est défini sur attribué dans IB. Mon code fonctionne bien en changeant simplement ceci en simple . Mais ce n'est pas une solution comme décrit dans le lien ci-dessus.

20
Jeff Lockhart

Les titres attribués sont obtenus via

- (NSAttributedString *)attributedTitleForState:(UIControlState)state

et réglez via

- (void)setAttributedTitle:(NSAttributedString *)title forState:(UIControlState)state

Le formatage de l'objet NSAttributedString est un peu compliqué, mais le définir sur nil effacera le titre et c'est ce dont j'avais besoin.

58
Jeff Lockhart

Avez-vous le bouton spécifié comme IBOutlet dans votre classe de contrôleur de vue, et est-il correctement connecté en tant que sortie dans Interface Builder (faites glisser le curseur de la nouvelle prise de référence vers le propriétaire du fichier et sélectionnez votre objet UIButton)? C'est généralement le problème que j'ai quand je vois ces symptômes. Spécifiez d'abord - @property(non atomic,strong)IBOutlet UIButton *mybutton;

ensuite

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];

9
Christien

en voici un

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self 
       action:@selector(aMethod:)
forControlEvents:UIControlEventTouchDown];
[button setTitle:@"Title" forState:UIControlStateNormal];
button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
 [view addSubview:button];

pas besoin de faire des changements dans- (void)setTitle:(NSString *)title

4
Christien

Swift - Pour une police barrée rouge dans un titre de bouton:

let attributedStringForInvalid = NSAttributedString(string: "I'm Invalid!", attributes: [
  NSStrikethroughStyleAttributeName: true,
  NSForegroundColorAttributeName: UIColor.redColor()
  ])
myButton.setAttributedTitle(attributedStringForInvalid, forState: UIControlState.Normal)
1
ObjectiveTC

J'ai dû utiliser les 4 lignes suivantes pour afficher la police attribuée. Dans IB, le titre est défini sur simple et non attribué.

// Get the library font
UIFont *termsFont = [MTHGAppearanceController defaultFontOfSize:[MTHGAppearanceController defaultButtonFontSizeForDevice]];
// Set the font attributes required, using our librarby function for setting the colour
NSDictionary *fontAttributes = @{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle),NSBackgroundColorAttributeName: [UIColor clearColor], NSFontAttributeName: termsFont, NSForegroundColorAttributeName:[UIColor mthg_color255WithRed:128.0f green:128.0f blue:128.0f alpha:1.0f]};
// Configure the text we want displayed using the font set above
NSAttributedString *termsString = [[NSAttributedString alloc]initWithString:@"Terms" attributes:fontAttributes];
// Now finally display the text in the required font
[self.termsButtonOutlet setAttributedTitle:termsString forState:UIControlStateNormal];
1
iCyberPaul