2014-10-01 14 views
36

Ich versuche, einen Teil eines Strings zu unterstreichen, zum Beispiel eine 'String' an 'Test-String' string. Ich verwende NSMutableAttributedString und meine Lösung funktionierte gut auf iOS7.Unterstrichen Teil eines Strings NSMutableAttributedString in iOS8 mit nicht funktioniert

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] 
     initWithString:@"test string"]; 
[attributedString addAttribute:NSUnderlineStyleAttributeName 
         value:@(NSUnderlineStyleSingle) 
         range:NSMakeRange(5, 6)]; 
myLabel.attributedText = attributedString; 

Das Problem ist, dass meine Lösung ist nicht mehr in iOS8 arbeiten. Nachdem ich eine Stunde lang mehrere Varianten von NSMutableAttributedString getestet hatte, fand ich heraus, dass diese Lösung nur funktioniert, wenn der Bereich mit 0 beginnt (Länge kann abweichen). Was ist der Grund dafür? Wie kann ich das umgehen?

+1

resolve Lösung ohne Anfügen: http://stackoverflow.com/a/27106188/2833978 – NSSakly

Antwort

85

Update: Durch diese Frage zu untersuchen: Displaying NSMutableAttributedString on iOS 8 ich endlich die Lösung gefunden!

Sie sollten NSUnderlineStyleNone am Anfang der Zeichenfolge hinzufügen.

Swift 4.0:

let attributedString = NSMutableAttributedString() 
attributedString.append(NSAttributedString(string: "test ", 
              attributes: [.underlineStyle: NSUnderlineStyle.styleNone.rawValue])) 
attributedString.append(NSAttributedString(string: "s", 
              attributes: [.underlineStyle: NSUnderlineStyle.styleSingle.rawValue])) 
attributedString.append(NSAttributedString(string: "tring", 
              attributes: [.underlineStyle: NSUnderlineStyle.styleNone.rawValue])) 

Objective-C:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init]; 
[attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"test " 
                      attributes:@{NSUnderlineStyleAttributeName: @(NSUnderlineStyleNone)}]]; 
[attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"s" 
                     attributes:@{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle), 
                         NSBackgroundColorAttributeName: [UIColor clearColor]}]]; 
[attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"tring"]]; 

Ein weiterer Vorteil eines solchen Ansatzes ist Abwesenheit von irgendwelchen Bereichen. Sehr schön für lokalisierte Strings.

Scheint, wie es Apple-Bug ist :(

+0

Ich dachte, es funktioniert, aber leider lief ich die app in 7.1 Simulator ... Immer noch nicht auf iOS8 arbeiten. Aber die Reichweite zu vermeiden ist sehr nett, danke! – KlimczakM

+0

Um ehrlich zu sein habe ich meinen Code auf iOS 8 nicht getestet. Aber jetzt habe ich es geschafft, und habe endlich die Lösung gefunden. – kelin

+0

Das hat funktioniert! Vielen Dank! – KlimczakM

-2

color für unterstrichen Attribut: ​ ​ ​

[attributedString addAttribute:NSUnderlineColorAttributeName 
        value:[UIColor redColor] 
        range:NSMakeRange(5, 6)]; 
5
NSMutableAttributedString *signUpString = [[NSMutableAttributedString alloc] initWithString:@"Not a member yet?Sign Up now"]; 

[signUpString appendAttributedString:[[NSAttributedString alloc] initWithString:@" " 
                     attributes:@{NSUnderlineStyleAttributeName: @(NSUnderlineStyleNone)}]]; 

[signUpString addAttributes: @{NSForegroundColorAttributeName:UIColorFromRGB(0x43484B),NSUnderlineStyleAttributeName:[NSNumber numberWithInteger:NSUnderlineStyleSingle]} range:NSMakeRange(17,11)]; 

signUpLbl.attributedText = [signUpString copy]; 

Es funktionierte für mich

15

ich gefunden, wenn Sie UnderlineStyleNone auf die gesamte Zeichenfolge anwenden können Sie dann anwenden selektiv auf einen Teil unterstreichen, die in beginnt in der Mitte:

func underlinedString(string: NSString, term: NSString) -> NSAttributedString { 
    let output = NSMutableAttributedString(string: string) 
    let underlineRange = string.rangeOfString(term) 
    output.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleNone.rawValue, range: NSMakeRange(0, string.length)) 
    output.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleSingle.rawValue, range: underlineRange) 

    return output 
} 
+0

wie kann unterstreichen nach hinzufügen entfernen –

0

ich die folgende Erweiterung verwendet in Spielplatz/Simulator (Exidy der Funktion) und es hat gut funktioniert, können Sie Attribute ändern/je nach muss

extension NSMutableAttributedString 
{ 


    func changeWordsColour(terms:[NSString]) 
{ 
    let string = self.string as NSString 
    self.addAttribute(NSForegroundColorAttributeName, value: UIColor.brownColor(), range: NSMakeRange(0, self.length)) 
    for term in terms 
    { 
     let underlineRange = string.rangeOfString(term as String) 
     self.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: underlineRange) 

    } 
} 
} 

let myStr = NSMutableAttributedString(string: "Change Words Colour") 
myStr.changeWordsColour(["change","Colour"]) 
Verwandte Themen