web-dev-qa-db-fra.com

Une manière audacieuse de faire partie d'un NSString?

Est-il possible de mettre en gras uniquement une partie d'une chaîne? Par exemple:

Distance approximative: 120m loin

Merci!

71
Zhen

Ce que vous pourriez faire, c’est utiliser un NSAttributedString .

NSString *boldFontName = [[UIFont boldSystemFontOfSize:12] fontName];
NSString *yourString = ...;
NSRange boldedRange = NSMakeRange(22, 4);

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:yourString];

[attrString beginEditing];
[attrString addAttribute:kCTFontAttributeName 
                   value:boldFontName
                   range:boldedRange];

[attrString endEditing];
//draw attrString here...

Jetez un coup d’œil à ce guide pratique pour dandy pour dessiner des objets NSAttributedString avec Core Text.

95
Jacob Relkin

Comme Jacob l'a mentionné, vous voudrez probablement utiliser un NSAttributedString ou un NSMutableAttributedString. Voici un exemple de la façon dont vous pourriez le faire.

NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"Approximate Distance: 120m away"];
NSRange selectedRange = NSMakeRange(22, 4); // 4 characters, starting at index 22

[string beginEditing];

[string addAttribute:NSFontAttributeName
           value:[NSFont fontWithName:@"Helvetica-Bold" size:12.0]
           range:selectedRange];

[string endEditing];
60
Chris Frederick

Si vous ne voulez pas vous soucier des polices (comme chaque variante de police ne contient pas "Gras"), voici une autre façon de procéder. Veuillez noter que cette option n'est actuellement disponible que sur OS X ...:

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:"Approximate Distance: 120m away"];
[attrString beginEditing];
[attrString applyFontTraits:NSBoldFontMask
                      range:NSMakeRange(22, 4)];
[attrString endEditing];
10
yura

Le code ci-dessus m'a causé un crash lorsque j'ai créé UILabel avec cette chaîne attribuée.

J'ai utilisé ce code et cela a fonctionné:

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange boldedRange = NSMakeRange(0, 1);
UIFont *fontText = [UIFont systemFontOfSize:12]; //[UIFont fontWithName:@"Lato-Bold" size:12];
NSDictionary *dictBoldText = [NSDictionary dictionaryWithObjectsAndKeys:fontText, NSFontAttributeName, nil];
[attrString setAttributes:dictBoldText range:boldedRange];
6
Andrew Marin

Rapide

Comprend également l’obtention de la plage de la chaîne que vous souhaitez dynamiser de manière dynamique

let nameString = "Magoo"
let string = "Hello my name is \(nameString)"

let attributes = [NSFontAttributeName:UIFont.systemFontOfSize(14.0),NSForegroundColorAttributeName: UIColor.black]
let boldAttribute = [NSFontAttributeName:UIFont.boldSystemFontOfSize(14.0)]

let attributedString = NSMutableAttributedString(string: string, attributes: attributes)

let nsString = NSString(string: string)
let range = nsString.rangeOfString(nameString)

if range.length > 0 { attributedString.setAttributes(boldAttribute, range: range) }

someLabel.attributedText = attributedString
4
Magoo

Pour mettre en gras une chaîne sans coder en dur sa police, vous pouvez utiliser l'attribut StrokeWidth avec une valeur négative:

let s = NSMutableAttributedString(string: "Approximate Distance: 120m away")
s.addAttribute(NSStrokeWidthAttributeName, value: NSNumber(value: -3.0), range: NSRange(22..<26))
4
Yonat

Un NSString est juste un conteneur de données. Il ne contient aucun détail sur les problèmes de présentation. 

Il semble que ce que vous souhaitiez probablement faire soit une partie en gras de la UILabel utilisée pour afficher votre chaîne. Ce que je ne pense pas que vous puissiez faire. Mais vous pouvez toujours diviser l’interface utilisateur en trois libellés, un pour "Distance approximative:", un pour "120 m" et un pour "absent". Placez-les en ligne les uns avec les autres et vous devriez obtenir l'effet désiré.

Une autre option pourrait être d'utiliser une variable UIWebView et un peu de balisage pour afficher votre chaîne avec des informations de formatage incorporées, comme indiqué ici: 

http://iphoneincubator.com/blog/windows-views/display-rich-text-using-a-uiwebview

3
aroth

Dans Xamarin ios, vous pouvez mettre en gras une partie d’un NSString de la manière suivante:

public static NSMutableAttributedString BoldRangeOfString (string str, float fontSize, int startRange, int lengthRange)
    {
        var firstAttributes = new UIStringAttributes {
            Font = UIFont.BoldSystemFontOfSize(fontSize)
        };

        NSMutableAttributedString boldString = new NSMutableAttributedString (str);
        boldString.SetAttributes (firstAttributes.Dictionary, new NSRange (startRange, lengthRange));
        return boldString;
    }    

et appelez cette méthode:

myLabel = new UILabel (); 
...
myLabel.AttributedText = BoldRangeOfString("my text", fontSize, startRange, lengthRange);    
2
Adi Rabi

J'ai couplé @Jacob Relkin et @Andrew Marin, sinon j'ai eu les accidents. Voici la réponse pour iOS9:

UIFont *boldFont = [UIFont boldSystemFontOfSize:12];
NSString *yourString = @"Approximate Distance: 120m away";
NSRange boldedRange = NSMakeRange(22, 4);

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:yourString];

[attrString beginEditing];
[attrString addAttribute:NSFontAttributeName 
                   value:boldFont
                   range:boldedRange];

[attrString endEditing];

J'ai jeté un œil à la documentation officielle: 1 et 2 .

2
Darius Miliauskas

Si vous ne voulez pas coder en dur la police ou/et la taille, essayez ce code pour mettre des chaînes pleines en gras:

NSMutableAttributedString *myString = [[NSMutableAttributedString alloc] initWithString:mainString];
[myString beginEditing];
[myString addAttribute:NSStrokeWidthAttributeName
                         value:[[NSNumber alloc] initWithInt: -3.f]
                         range:NSMakeRange(0, [mainString length])];
[myString endEditing];
0
oskarko