Wie kann man einen Teil eines NSString fett machen?

77

Gibt es eine Möglichkeit, nur einen Teil einer Zeichenfolge fett zu schreiben? Zum Beispiel:

Ungefähre Entfernung: 120 m entfernt

Vielen Dank!

Zhen
quelle
3
Dies hängt davon ab, in was Sie es anzeigen, da eine Zeichenfolge nur aus einer Reihe von Zeichen besteht und keine Formatierungsinformationen enthält.
BoltClock

Antworten:

103

Was Sie tun könnten , ist eine 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...

Schauen Sie sich diese praktische Dandy-Anleitung zum Zeichnen von NSAttributedStringObjekten mit Core Text an.

Jacob Relkin
quelle
2
Kann mir jemand sagen, wie "kCTFontAttributeName" definiert ist?
Sohan
1
Hoppla. Ich habe gerade herausgefunden, dass es sich um eine Konstante handelt, die in CTFont.h in Ihrem CoreText-Framework definiert ist.
Sohan
8
es heißt: Verwendung des undefinierten Bezeichners 'kCTFontAttributeName', meinten Sie 'NSFontAttributeName'? Was ist daran falsch? Kann ich stattdessen NSFontAttributeName verwenden?
Tester
1
@tester Gegen welche Version von iOS bauen Sie? Ich denke, NSFontAttributeNameist nur unter OS X verfügbar.
Jacob Relkin
11
Dieser funktioniert nicht unter iOS7 (stürzt mit exc_bad_access ab). Der Grund dafür ist, dass Sie die Schriftart anstelle des Schriftartnamens als Teil der Nachricht senden müssen. @ Chris Frederick macht es unten richtig.
Philippe Sabourin
61

Wie Jacob erwähnt hat, möchten Sie wahrscheinlich ein NSAttributedStringoder ein verwenden NSMutableAttributedString. Das Folgende ist ein Beispiel dafür, wie Sie dies tun könnten.

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];
Chris Frederick
quelle
1
Wenn ich das versuche, stehe ich Use of Undeclared identifier 'NSFont'in der value:Leitung. Wie behebe ich das?
ZuluDeltaNiner
Dies ist ein großartiges Beispiel. In der ersten Zeile fehlt @nach Ihrer initWithString:Methode eine Zeichenfolge um die Beispielzeichenfolge . :)
Clifton Labrum
12
@ZuluDeltaNiner Wenn Sie iOS verwenden, ersetzen Sie NSFontdurchUIFont
Clifton Labrum
Ich habe es vor einiger Zeit herausgefunden; Ich habe wohl vergessen, meinen Kommentar zu löschen.
ZuluDeltaNiner
2
Rettete mich! Die Antwort auf diese Frage muss bearbeitet werden. Ich verbrachte ungefähr zwei Stunden mit diesem & ^% #
Michal Shatz
12

Wenn Sie sich nicht mit Schriftarten beschäftigen möchten (da nicht jede Schriftvariante "Fett" enthält), können Sie dies auf folgende Weise tun. Bitte beachten Sie, dass dies derzeit nur unter OS X verfügbar ist ...:

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:"Approximate Distance: 120m away"];
[attrString beginEditing];
[attrString applyFontTraits:NSBoldFontMask
                      range:NSMakeRange(22, 4)];
[attrString endEditing];
Yura
quelle
NSBoldFontMask ist für iOS nicht deklariert? Irgendein Ersatz?
coolcool1994
@ coolcool1994 - Sorry, nicht dass ich es wüsste. Ich werde meine Antwort bearbeiten, um zu verdeutlichen, dass dies nur ein Trick für OS X ist ...
Yura
beginEditing und endEditing werden von Unterklassen überschrieben, um eine Reihe von Änderungen an den Zeichen oder Attributen des Empfängers zu puffern oder zu optimieren. Sie werden hier nicht benötigt. Ansonsten war das genau das, was ich brauchte.
green_knight
6

Der obige Code hat mich zum Absturz gebracht, als ich UILabel mit diesem zugeschriebenen String erstellt habe.

Ich habe diesen Code verwendet und es hat funktioniert:

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];
Andrew Marin
quelle
5

Schnell

Beinhaltet auch das Abrufen des Bereichs der Zeichenfolge, die Sie dynamisch ermutigen möchten

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
Magoo
quelle
4

Um eine Zeichenfolge fett zu schreiben, ohne ihre Schriftart fest zu codieren, können Sie das StrokeWidth-Attribut mit einem negativen Wert verwenden:

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

An NSStringist nur ein Datencontainer. Es enthält keine Details zu Präsentationsproblemen.

Es hört sich so an, als ob Sie wahrscheinlich einen fett gedruckten Teil des UILabelStrings verwenden möchten , der zum Anzeigen Ihrer Zeichenfolge verwendet wird. Was ich nicht glaube, dass du es kannst. Sie können die Benutzeroberfläche jedoch jederzeit in drei Bezeichnungen unterteilen, eine für "Ungefähre Entfernung:", eine für " 120 m " und eine für "weg". Platzieren Sie sie in einer Linie miteinander und Sie sollten den gewünschten Effekt erzielen.

Eine andere Option könnte darin bestehen, UIWebViewein wenig Markup zu verwenden, um Ihre Zeichenfolge mit eingebetteten Formatierungsinformationen anzuzeigen, wie hier beschrieben:

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

Aroth
quelle
2

In Xamarin ios können Sie einen Teil eines NSString folgendermaßen fett formatieren:

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;
    }    

und rufen Sie diese Methode auf:

myLabel = new UILabel (); 
...
myLabel.AttributedText = BoldRangeOfString("my text", fontSize, startRange, lengthRange);    
Adi Rabi
quelle
6
Die Frage betraf nicht Xamarin.
Zia
4
Xamarin arbeitet mit demselben Objekt NSString. In der Frage wurde nicht angegeben, in welcher Sprache die Antwort sein soll. Ich bin hierher gekommen, um nach der Xamarin-Syntax zu suchen. Gültige Antwort.
Wurzel
2

Ich habe @Jacob Relkin gekoppelt und @Andrew Marin antwortet, sonst habe ich die Abstürze bekommen. Hier ist die Antwort für 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];

Ich habe mir die offiziellen Unterlagen angesehen: 1 und 2 .

Darius Miliauskas
quelle
1

Kürzere Art und Weise mit Swift5 +

let labelNotes = UILabel()  //or UITextView(), etc...
let attributedNotes = NSMutableAttributedString(string: "Bold: some stuff not bold")
attributedNotes.addAttribute(NSAttributedString.Key.font, value: UIFont.boldSystemFont(ofSize: 14), range: NSRange(location: 0, length: 5))
labelNotes.attributedText = attributedNotes
Vette
quelle
0

Wenn Sie die Schriftart oder / und die Größe nicht fest codieren möchten, versuchen Sie diesen Code, um vollständige Zeichenfolgen zu fetten:

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