คุณใช้ NSAttributedString อย่างไร


308

หลายสีในNSStringหรือNSMutableStringsเป็นไปไม่ได้ ดังนั้นผมเคยได้ยินเพียงเล็กน้อยเกี่ยวกับที่NSAttributedStringซึ่งเป็นที่รู้จักกับSDK 3.2 iPad (ประมาณ 3.2) และสามารถใช้ได้บน iPhone เช่นiPhone SDK 4.0 เบต้า

ฉันต้องการสตริงที่มีสามสี

เหตุผลที่ฉันไม่ได้ใช้ NSStrings 3 ตัวแยกกันเป็นเพราะความยาวของแต่ละNSAttributedStringsubstrings มีการเปลี่ยนแปลงบ่อยครั้งดังนั้นฉันจึงไม่ต้องการใช้การคำนวณใด ๆ เพื่อจัดตำแหน่งNSStringวัตถุแยก 3 ชิ้นใหม่

ถ้าเป็นไปได้โดยใช้NSAttributedStringฉันจะทำต่อไปนี้อย่างไร - (ถ้าไม่สามารถทำได้ด้วยสตริง NSAttributed คุณจะทำอย่างไร):

ข้อความแสดงแทน

แก้ไข: โปรดจำไว้ว่า@"first", @"second"และ@"third"จะถูกแทนที่ด้วยสตริงอื่น ๆ ในเวลาใดก็ได้ ดังนั้นการใช้ค่า NSRange ของฮาร์ดโค้ดจะไม่ทำงาน



รหัส Swift สำหรับ NSAttributeString: stackoverflow.com/questions/27728466//
Kirit Modi

คำตอบ:


479

เมื่อสร้างสตริงที่มีการบันทึกฉันต้องการใช้คลาสย่อยที่ไม่แน่นอนเพียงเพื่อให้ทุกสิ่งสะอาดขึ้น

ดังที่ได้กล่าวมานี่คือวิธีที่คุณสร้างสตริงประกอบสามสี:

NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:@"firstsecondthird"];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];

พิมพ์ในเบราว์เซอร์ ผู้พัฒนาคำเตือน

เห็นได้ชัดว่าคุณจะไม่ได้รหัสยากในช่วงเช่นนี้ บางทีคุณอาจทำสิ่งที่ชอบแทน:

NSDictionary * wordToColorMapping = ....;  //an NSDictionary of NSString => UIColor pairs
NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:@""];
for (NSString * word in wordToColorMapping) {
  UIColor * color = [wordToColorMapping objectForKey:word];
  NSDictionary * attributes = [NSDictionary dictionaryWithObject:color forKey:NSForegroundColorAttributeName];
  NSAttributedString * subString = [[NSAttributedString alloc] initWithString:word attributes:attributes];
  [string appendAttributedString:subString];
  [subString release];
}

//display string

4
คุณช่วยบอกให้ฉันรู้วิธีการกำหนดสายอักขระประกอบกับฉลากได้ไหม?
Pooja M. Bohora

5
@SyedFarazHaiderZaidi ไม่มีอะไรในตัว UIKit NSAttributedStringเป็นเรื่องที่ยอมรับ แต่มีสิ่งที่มาเปิดเช่นOHAttributedLabel
Dave DeLong

4
หากคุณกำลังใช้ CoreText.framework บน iOS คุณอาจจะต้องการอย่างต่อเนื่องมากกว่าkCTForegroundColorAttributeName NSForegroundColorAttributeName
Phil Calvin

32
ใน iOS6 ซึ่งเพิ่งเปิดตัว (ดังนั้นฉันจึงสามารถพูดได้โดยไม่ใช้ NDA) คุณสามารถทำสิ่งต่าง ๆ เช่น myLabel.attributedText = formededString; มันเป็นเรื่องของเวลาว่าง ... ฉันรอคุณลักษณะนี้มานานหลายปีแล้ว
Kevin Hoffman

5
คำเตือน: ปุ่มพจนานุกรมไม่มีการเรียงลำดับ อย่าใช้รหัสด้านบนคุณจะสูญเสียการควบคุมลำดับของสายอักขระที่จะแสดง
Matt-Lloyd

117

ตอบคำถามแล้ว ... แต่ฉันต้องการแสดงวิธีเพิ่มเงาและเปลี่ยนแบบอักษรด้วย NSAttributedString เช่นกันดังนั้นเมื่อผู้คนค้นหาหัวข้อนี้พวกเขาจะไม่ต้องมองต่อไป

#define FONT_SIZE 20
#define FONT_HELVETICA @"Helvetica-Light"
#define BLACK_SHADOW [UIColor colorWithRed:40.0f/255.0f green:40.0f/255.0f blue:40.0f/255.0f alpha:0.4f]

NSString*myNSString = @"This is my string.\nIt goes to a second line.";                

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
               paragraphStyle.alignment = NSTextAlignmentCenter;
             paragraphStyle.lineSpacing = FONT_SIZE/2;
                     UIFont * labelFont = [UIFont fontWithName:FONT_HELVETICA size:FONT_SIZE];
                   UIColor * labelColor = [UIColor colorWithWhite:1 alpha:1];
                       NSShadow *shadow = [[NSShadow alloc] init];
                 [shadow setShadowColor : BLACK_SHADOW];
                [shadow setShadowOffset : CGSizeMake (1.0, 1.0)];
            [shadow setShadowBlurRadius : 1];

NSAttributedString *labelText = [[NSAttributedString alloc] initWithString : myNSString
                      attributes : @{
   NSParagraphStyleAttributeName : paragraphStyle,
             NSKernAttributeName : @2.0,
             NSFontAttributeName : labelFont,
  NSForegroundColorAttributeName : labelColor,
           NSShadowAttributeName : shadow }];

นี่คือเวอร์ชั่น Swift ...

คำเตือน! ใช้งานได้สำหรับ 4s

สำหรับ 5 วินาทีคุณต้องเปลี่ยนค่า Float ทั้งหมดเป็นค่า Double (เพราะคอมไพเลอร์ยังทำงานไม่ถูกต้อง)

Swift enum สำหรับการเลือกแบบอักษร:

enum FontValue: Int {
    case FVBold = 1 , FVCondensedBlack, FVMedium, FVHelveticaNeue, FVLight, FVCondensedBold, FVLightItalic, FVUltraLightItalic, FVUltraLight, FVBoldItalic, FVItalic
}

อาร์เรย์ Swift สำหรับการเข้าถึง enum (จำเป็นเนื่องจาก enum ไม่สามารถใช้ '-'):

func helveticaFont (index:Int) -> (String) {
    let fontArray = [
    "HelveticaNeue-Bold",
    "HelveticaNeue-CondensedBlack",
    "HelveticaNeue-Medium",
    "HelveticaNeue",
    "HelveticaNeue-Light",
    "HelveticaNeue-CondensedBold",
    "HelveticaNeue-LightItalic",
    "HelveticaNeue-UltraLightItalic",
    "HelveticaNeue-UltraLight",
    "HelveticaNeue-BoldItalic",
    "HelveticaNeue-Italic",
    ]
    return fontArray[index]
}

ฟังก์ชันข้อความประกอบ Swift:

func myAttributedText (myString:String, mySize: Float, myFont:FontValue) -> (NSMutableAttributedString) {

    let shadow = NSShadow()
    shadow.shadowColor = UIColor.textShadowColor()
    shadow.shadowOffset = CGSizeMake (1.0, 1.0)
    shadow.shadowBlurRadius = 1

    let paragraphStyle = NSMutableParagraphStyle.alloc()
    paragraphStyle.lineHeightMultiple = 1
    paragraphStyle.lineBreakMode = NSLineBreakMode.ByWordWrapping
    paragraphStyle.alignment = NSTextAlignment.Center

    let labelFont = UIFont(name: helveticaFont(myFont.toRaw()), size: mySize)
    let labelColor = UIColor.whiteColor()

    let myAttributes :Dictionary = [NSParagraphStyleAttributeName : paragraphStyle,
                                              NSKernAttributeName : 3, // (-1,5)
                                              NSFontAttributeName : labelFont,
                                   NSForegroundColorAttributeName : labelColor,
                                            NSShadowAttributeName : shadow]

    let myAttributedString = NSMutableAttributedString (string: myString, attributes:myAttributes)

    // add new color 
    let secondColor = UIColor.blackColor()
    let stringArray = myString.componentsSeparatedByString(" ")
    let firstString: String? = stringArray.first
    let letterCount = countElements(firstString!)
    if firstString {
        myAttributedString.addAttributes([NSForegroundColorAttributeName:secondColor], range:NSMakeRange(0,letterCount))
    }

    return  myAttributedString
}

นามสกุลแรกและนามสกุลที่ใช้สำหรับค้นหาช่วงในสตริงอาร์เรย์:

extension Array {
    var last: T? {
        if self.isEmpty {
            NSLog("array crash error - please fix")
            return self [0]
        } else {
            return self[self.endIndex - 1]
        }
    }
}

extension Array {
    var first: T? {
        if self.isEmpty {
            NSLog("array crash error - please fix")
            return self [0]
        } else {
            return self [0]
        }
    }
}

สีใหม่:

extension UIColor {
    class func shadowColor() -> UIColor {
        return UIColor(red: 0.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: 0.3)
    }
    class func textShadowColor() -> UIColor {
        return UIColor(red: 50.0/255.0, green: 50.0/255.0, blue: 50.0/255.0, alpha: 0.5)
    }
    class func pastelBlueColor() -> UIColor {
        return UIColor(red: 176.0/255.0, green: 186.0/255.0, blue: 255.0/255.0, alpha: 1)
    }
    class func pastelYellowColor() -> UIColor {
        return UIColor(red: 255.0/255.0, green: 238.0/255.0, blue: 140.0/255.0, alpha: 1)
    }
}

การแทนที่มาโครของฉัน:

enum MyConstants: Float {
    case CornerRadius = 5.0
}

ผู้สร้างปุ่มของฉัน w / ข้อความประกอบ:

func myButtonMaker (myView:UIView) -> UIButton {

    let myButton = UIButton.buttonWithType(.System) as UIButton
    myButton.backgroundColor = UIColor.pastelBlueColor()
    myButton.showsTouchWhenHighlighted = true;
    let myCGSize:CGSize = CGSizeMake(100.0, 50.0)
    let myFrame = CGRectMake(myView.frame.midX - myCGSize.height,myView.frame.midY - 2 * myCGSize.height,myCGSize.width,myCGSize.height)
    myButton.frame = myFrame
    let myTitle = myAttributedText("Button",20.0,FontValue.FVLight)
    myButton.setAttributedTitle(myTitle, forState:.Normal)

    myButton.layer.cornerRadius = myButton.bounds.size.width / MyConstants.CornerRadius.toRaw()
    myButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
    myButton.tag = 100
    myButton.bringSubviewToFront(myView)
    myButton.layerGradient()

    myView.addSubview(myButton)

    return  myButton
}

UIView / UILabel maker ของฉันที่ประกอบด้วยข้อความ, เงาและมุมรอบ:

func myLabelMaker (myView:UIView) -> UIView {

    let myFrame = CGRectMake(myView.frame.midX / 2 , myView.frame.midY / 2, myView.frame.width/2, myView.frame.height/2)
    let mylabelFrame = CGRectMake(0, 0, myView.frame.width/2, myView.frame.height/2)

    let myBaseView = UIView()
    myBaseView.frame = myFrame
    myBaseView.backgroundColor = UIColor.clearColor()

    let myLabel = UILabel()
    myLabel.backgroundColor=UIColor.pastelYellowColor()
    myLabel.frame = mylabelFrame

    myLabel.attributedText = myAttributedText("This is my String",20.0,FontValue.FVLight)
    myLabel.numberOfLines = 5
    myLabel.tag = 100
    myLabel.layer.cornerRadius = myLabel.bounds.size.width / MyConstants.CornerRadius.toRaw()
    myLabel.clipsToBounds = true
    myLabel.layerborders()

    myBaseView.addSubview(myLabel)

    myBaseView.layerShadow()
    myBaseView.layerGradient()

    myView.addSubview(myBaseView)

    return myLabel
}

เงาทั่วไปเพิ่ม:

func viewshadow<T where T: UIView> (shadowObject: T)
{
    let layer = shadowObject.layer
    let radius = shadowObject.frame.size.width / MyConstants.CornerRadius.toRaw();
    layer.borderColor = UIColor.whiteColor().CGColor
    layer.borderWidth = 0.8
    layer.cornerRadius = radius
    layer.shadowOpacity = 1
    layer.shadowRadius = 3
    layer.shadowOffset = CGSizeMake(2.0,2.0)
    layer.shadowColor = UIColor.shadowColor().CGColor
}

มุมมองส่วนขยายสำหรับสไตล์มุมมอง:

extension UIView {
    func layerborders() {
        let layer = self.layer
        let frame = self.frame
        let myColor = self.backgroundColor
        layer.borderColor = myColor.CGColor
        layer.borderWidth = 10.8
        layer.cornerRadius = layer.borderWidth / MyConstants.CornerRadius.toRaw()
    }

    func layerShadow() {
        let layer = self.layer
        let frame = self.frame
        layer.cornerRadius = layer.borderWidth / MyConstants.CornerRadius.toRaw()
        layer.shadowOpacity = 1
        layer.shadowRadius = 3
        layer.shadowOffset = CGSizeMake(2.0,2.0)
        layer.shadowColor = UIColor.shadowColor().CGColor
    }

    func layerGradient() {
        let layer = CAGradientLayer()
        let size = self.frame.size
        layer.frame.size = size
        layer.frame.origin = CGPointMake(0.0,0.0)
        layer.cornerRadius = layer.bounds.size.width / MyConstants.CornerRadius.toRaw();

        var color0 = CGColorCreateGenericRGB(250.0/255, 250.0/255, 250.0/255, 0.5)
        var color1 = CGColorCreateGenericRGB(200.0/255, 200.0/255, 200.0/255, 0.1)
        var color2 = CGColorCreateGenericRGB(150.0/255, 150.0/255, 150.0/255, 0.1)
        var color3 = CGColorCreateGenericRGB(100.0/255, 100.0/255, 100.0/255, 0.1)
        var color4 = CGColorCreateGenericRGB(50.0/255, 50.0/255, 50.0/255, 0.1)
        var color5 = CGColorCreateGenericRGB(0.0/255, 0.0/255, 0.0/255, 0.1)
        var color6 = CGColorCreateGenericRGB(150.0/255, 150.0/255, 150.0/255, 0.1)

        layer.colors = [color0,color1,color2,color3,color4,color5,color6]
        self.layer.insertSublayer(layer, atIndex: 2)
    }
}

มุมมองจริงโหลดฟังก์ชัน:

func buttonPress (sender:UIButton!) {
    NSLog("%@", "ButtonPressed")
}

override func viewDidLoad() {
    super.viewDidLoad()

    let myLabel = myLabelMaker(myView)
    let myButton = myButtonMaker(myView)

    myButton.addTarget(self, action: "buttonPress:", forControlEvents:UIControlEvents.TouchUpInside)

    viewshadow(myButton)
    viewshadow(myLabel)

}

33

ฉันคิดว่ามันเป็นวิธีที่สะดวกมากที่จะใช้regular expressionsเพื่อหาช่วงสำหรับการใช้คุณสมบัติต่างๆ นี่คือวิธีที่ฉันทำ:

NSMutableAttributedString *goodText = [[NSMutableAttributedString alloc] initWithString:articleText];

NSRange range = [articleText rangeOfString:@"\\[.+?\\]" options:NSRegularExpressionSearch|NSCaseInsensitiveSearch];
if (range.location != NSNotFound) {
    [goodText addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Georgia" size:16] range:range];
    [goodText addAttribute:NSForegroundColorAttributeName value:[UIColor brownColor] range:range];
}

NSString *regEx = [NSString stringWithFormat:@"%@.+?\\s", [self.article.titleText substringToIndex:0]];
range = [articleText rangeOfString:regEx options:NSRegularExpressionSearch|NSCaseInsensitiveSearch];
if (range.location != NSNotFound) {
    [goodText addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Georgia-Bold" size:20] range:range];
    [goodText addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:range];
}

[self.textView setAttributedText:goodText];

ฉันกำลังค้นหารายการของคุณลักษณะที่มีอยู่และไม่พบพวกเขาที่นี่และในหน้าแรกของการอ้างอิงระดับ ดังนั้นฉันจึงตัดสินใจโพสต์ข้อมูลที่นี่

คุณสมบัติมาตรฐาน

สตริงที่มาประกอบสนับสนุนแอตทริบิวต์มาตรฐานต่อไปนี้สำหรับข้อความ หากคีย์ไม่ได้อยู่ในพจนานุกรมให้ใช้ค่าเริ่มต้นที่อธิบายไว้ด้านล่าง

NSString *NSFontAttributeName;
NSString *NSParagraphStyleAttributeName;
NSString *NSForegroundColorAttributeName;
NSString *NSUnderlineStyleAttributeName;
NSString *NSSuperscriptAttributeName;
NSString *NSBackgroundColorAttributeName;
NSString *NSAttachmentAttributeName;
NSString *NSLigatureAttributeName;
NSString *NSBaselineOffsetAttributeName;
NSString *NSKernAttributeName;
NSString *NSLinkAttributeName;
NSString *NSStrokeWidthAttributeName;
NSString *NSStrokeColorAttributeName;
NSString *NSUnderlineColorAttributeName;
NSString *NSStrikethroughStyleAttributeName;
NSString *NSStrikethroughColorAttributeName;
NSString *NSShadowAttributeName;
NSString *NSObliquenessAttributeName;
NSString *NSExpansionAttributeName;
NSString *NSCursorAttributeName;
NSString *NSToolTipAttributeName;
NSString *NSMarkedClauseSegmentAttributeName;
NSString *NSWritingDirectionAttributeName;
NSString *NSVerticalGlyphFormAttributeName;
NSString *NSTextAlternativesAttributeName;

คู่มือการเขียนโปรแกรม NSAttributedString

การอ้างอิงระดับเต็มรูปแบบที่นี่


ขอบคุณสำหรับรายการคีย์แอตทริบิวต์ (หายากมาก)
Ali Saeed

คุณจะทำสิ่งนี้ใน Swift ได้อย่างไร
โธมัสมาร์ติเนซ

25

วิธีนี้ใช้ได้ผลไม่ว่าจะยาวเท่าใดก็ตาม

NSString *strFirst = @"Anylengthtext";
NSString *strSecond = @"Anylengthtext";
NSString *strThird = @"Anylengthtext";

NSString *strComplete = [NSString stringWithFormat:@"%@ %@ %@",strFirst,strSecond,strThird];

NSMutableAttributedString *attributedString =[[NSMutableAttributedString alloc] initWithString:strComplete];

[attributedString addAttribute:NSForegroundColorAttributeName
              value:[UIColor redColor]
              range:[strComplete rangeOfString:strFirst]];

[attributedString addAttribute:NSForegroundColorAttributeName
              value:[UIColor yellowColor]
              range:[strComplete rangeOfString:strSecond]];

[attributedString addAttribute:NSForegroundColorAttributeName
              value:[UIColor blueColor]
              range:[strComplete rangeOfString:strThird]];


self.lblName.attributedText = attributedString;

โปรดทราบว่าสำหรับ SWIFT คุณจำเป็นต้องใช้ NSString ยังเพราะช่วงตรวจสอบคำตอบนี้: stackoverflow.com/a/27041376/1736679
Efren

15

ฉันเขียนผู้ช่วยเพื่อเพิ่มคุณสมบัติอย่างง่ายดาย:

- (void)addColor:(UIColor *)color substring:(NSString *)substring;
- (void)addBackgroundColor:(UIColor *)color substring:(NSString *)substring;
- (void)addUnderlineForSubstring:(NSString *)substring;
- (void)addStrikeThrough:(int)thickness substring:(NSString *)substring;
- (void)addShadowColor:(UIColor *)color width:(int)width height:(int)height radius:(int)radius substring:(NSString *)substring;
- (void)addFontWithName:(NSString *)fontName size:(int)fontSize substring:(NSString *)substring;
- (void)addAlignment:(NSTextAlignment)alignment substring:(NSString *)substring;
- (void)addColorToRussianText:(UIColor *)color;
- (void)addStrokeColor:(UIColor *)color thickness:(int)thickness substring:(NSString *)substring;
- (void)addVerticalGlyph:(BOOL)glyph substring:(NSString *)substring;

https://github.com/shmidt/MASAttributes

คุณสามารถติดตั้งผ่าน CocoaPods ได้เช่นกัน: pod 'MASAttributes', '~> 1.0.0'


11

ตั้งแต่ iOS 7 คุณสามารถใช้NSAttributedStringกับไวยากรณ์ HTML:

NSURL *htmlString = [[NSBundle mainBundle]  URLForResource: @"string"     withExtension:@"html"];
NSAttributedString *stringWithHTMLAttributes = [[NSAttributedString alloc] initWithFileURL:htmlString
                                                                                       options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType}
                                                                            documentAttributes:nil
                                                                                         error:nil];
textView.attributedText = stringWithHTMLAttributes;// you can use a label also

คุณต้องเพิ่มไฟล์ "string.html" ลงในโครงการของคุณและเนื้อหาของ html อาจเป็นดังนี้:

<html>
  <head>
    <style type="text/css">
      body {
        font-size: 15px;
        font-family: Avenir, Arial, sans-serif;
      }
      .red {
        color: red;
      }
      .green {
        color: green;
      }
      .blue {
        color: blue;
      }
    </style>
  </head>
  <body>
    <span class="red">first</span><span class="green">second</span><span class="blue">third</span>
  </body>
</html>  

ตอนนี้คุณสามารถใช้งานได้NSAttributedStringตามที่คุณต้องการแม้ไม่มีไฟล์ HTML เช่น:

//At the top of your .m file
#define RED_OCCURENCE -red_occurence-
#define GREEN_OCCURENCE -green_occurence-
#define BLUE_OCCURENCE -blue_occurence-
#define HTML_TEMPLATE @"<span style=\"color:red\">-red_occurence-</span><span style=\"color:green\">-green_occurence-</span><span style=\"color:blue\">-blue_occurence-</span></body></html>"

//Where you need to use your attributed string
NSString *string = [HTML_TEMPLATE stringByReplacingOccurrencesOfString:RED_OCCURENCE withString:@"first"] ;
string = [string stringByReplacingOccurrencesOfString:GREEN_OCCURENCE   withString:@"second"];
string = [string stringByReplacingOccurrencesOfString:BLUE_OCCURENCE    withString:@"third"];

NSData* cData = [string dataUsingEncoding:NSUTF8StringEncoding];

NSAttributedString *stringWithHTMLAttributes = [[NSAttributedString alloc] initWithData:cData
                                                                                options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType}
                                                                        documentAttributes:nil
                                                                                     error:nil];
textView.attributedText = stringWithHTMLAttributes;

แหล่ง


10

ฉันมักจะพบว่าการทำงานกับสายที่มีการบันทึกไว้เป็นกระบวนการที่ยืดยาวและน่าเบื่ออย่างไม่น่าเชื่อ

ดังนั้นฉันจึงสร้าง Mac App ที่สร้างรหัสทั้งหมดให้คุณ

https://itunes.apple.com/us/app/attributed-string-creator/id730928349?mt=12


นอกจากนี้ที่นี่ยังมีหมวดหมู่ / บล็อกโพสต์สำหรับการทำให้สตริง NSAttributed ง่ายขึ้นอีกเล็กน้อย raizlabs.com/dev/2014/03/nsattributedstring-creation-helpers
Alex Rouse

3

ทางออกที่ง่ายขึ้นด้วยการขยายสตริง

extension NSMutableAttributedString {

    // this function attaches color to string    
    func setColorForText(textToFind: String, withColor color: UIColor) {
        let range: NSRange = self.mutableString.range(of: textToFind, options: .caseInsensitive)
        self.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)
    }

}

ลองสิ่งนี้และดู (ทดสอบใน Swift 3 & 4)

let label = UILabel()
label.frame = CGRect(x: 120, y: 100, width: 200, height: 30)
let first = "first"
let second = "second"
let third = "third"
let stringValue = "\(first)\(second)\(third)"  // or direct assign single string value like "firstsecondthird"

let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringValue)
attributedString.setColorForText(textToFind: first, withColor: UIColor.red)   // use variable for string "first"
attributedString.setColorForText(textToFind: "second", withColor: UIColor.green) // or direct string like this "second"
attributedString.setColorForText(textToFind: third, withColor: UIColor.blue)
label.font = UIFont.systemFont(ofSize: 26)
label.attributedText = attributedString
self.view.addSubview(label)

นี่คือผลที่คาดหวัง:

ป้อนคำอธิบายรูปภาพที่นี่


3

ในสวิฟต์ 4:

let string:NSMutableAttributedString = {

    let mutableString = NSMutableAttributedString(string: "firstsecondthird")

    mutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.red , range: NSRange(location: 0, length: 5))
    mutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.green , range: NSRange(location: 5, length: 6))
    mutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blue , range: NSRange(location: 11, length: 5))
    return mutableString
}()

print(string)

1
โปรดอย่าโพสต์คำตอบที่เหมือนกันสำหรับคำถามหลายข้อ โพสต์คำตอบที่ดีหนึ่งข้อจากนั้นลงคะแนน / ตั้งค่าสถานะเพื่อปิดคำถามอื่น ๆ เป็นแบบซ้ำ หากคำถามไม่ซ้ำให้ปรับคำตอบของคำถาม
Paul Roub

ฉันพยายามที่จะให้คำตอบในสวิฟท์ ฉันยอมรับสำเนาซ้ำ ไม่ได้คาดหวังถึงคะแนนโหวต
Ankit garg

ขอโทษ. ฉันลบคำตอบออกแล้ว
Ankit garg

2

คุณสามารถโหลดHTMLสตริงที่ระบุได้Swiftดังนี้

   var Str = NSAttributedString(
   data: htmlstring.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true),
   options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
   documentAttributes: nil,
   error: nil)

   label.attributedText = Str  

เพื่อโหลดhtmlจากไฟล์

   if let rtf = NSBundle.mainBundle().URLForResource("rtfdoc", withExtension: "rtf", subdirectory: nil, localization: nil) {

   let attributedString = NSAttributedString(fileURL: rtf, options: [NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType], documentAttributes: nil, error: nil)
        textView.attributedText = attributedString
        textView.editable = false
    }

http://sketchytech.blogspot.in/2013/11/creating-nsattributedstring-from-html.html

และสตริงตั้งค่าตามแอตทริบิวต์ที่จำเป็นของคุณ .... ตามนี้ ..
http://makeapppie.com/2014/10/20/swift-swift-using-attributed-strings-in-swift/


2

ฉันสร้างห้องสมุดที่ทำให้ง่ายขึ้นมาก ตรวจสอบZenCopy

คุณสามารถสร้างสไตล์วัตถุและ / หรือตั้งค่าเป็นคีย์เพื่ออ้างอิงในภายหลัง แบบนี้:

ZenCopy.manager.config.setStyles {
    return [
        "token": Style(
            color: .blueColor(), // optional
            // fontName: "Helvetica", // optional
            fontSize: 14 // optional
        )
    ]
}

จากนั้นคุณสามารถสร้างสตริงและกำหนดสไตล์และมีพารามิเตอร์ได้อย่างง่ายดาย :)

label.attributedText = attributedString(
                                ["$0 ".style("token") "is dancing with ", "$1".style("token")], 
                          args: ["JP", "Brock"]
)

คุณสามารถจัดสไตล์สิ่งต่าง ๆ ได้อย่างง่ายดายด้วยการค้นหา regex!

let atUserRegex = "(@[A-Za-z0-9_]*)"
mutableAttributedString.regexFind(atUserRegex, addStyle: "token")

วิธีนี้จะจัดรูปแบบคำทั้งหมดด้วย '@' ด้านหน้าด้วยสไตล์ 'token' (เช่น @jpmcglone)

ฉันต้องการที่จะยังคงได้รับมันทำงาน w / ทุกอย่างNSAttributedStringมีที่จะนำเสนอ แต่ฉันคิดว่าfontName, fontSizeและฝาครอบสีจำนวนมากของมัน คาดว่าจะมีการอัพเดทมากมายเร็ว ๆ นี้ :)

ฉันสามารถช่วยคุณเริ่มต้นกับสิ่งนี้หากคุณต้องการ มองหาข้อเสนอแนะด้วยดังนั้นถ้ามันทำให้ชีวิตของคุณง่ายขึ้นฉันก็จะบอกว่าภารกิจสำเร็จ


1
- (void)changeColorWithString:(UILabel *)uilabel stringToReplace:(NSString *) stringToReplace uiColor:(UIColor *) uiColor{
    NSMutableAttributedString *text =
    [[NSMutableAttributedString alloc]
     initWithAttributedString: uilabel.attributedText];

    [text addAttribute: NSForegroundColorAttributeName value:uiColor range:[uilabel.text rangeOfString:stringToReplace]];

    [uilabel setAttributedText: text];

}

0

เพื่อแก้ปัญหาแบบนี้ฉันได้สร้างห้องสมุดอย่างรวดเร็วซึ่งเรียกว่า Atributika

let str = "<r>first</r><g>second</g><b>third</b>".style(tags:
        Style("r").foregroundColor(.red),
        Style("g").foregroundColor(.green),
        Style("b").foregroundColor(.blue)).attributedString

label.attributedText = str

คุณสามารถค้นหาได้ที่นี่https://github.com/psharanda/Atributika


0

สวิฟต์ 4

let combination = NSMutableAttributedString()

var part1 = NSMutableAttributedString()
var part2 = NSMutableAttributedString()
var part3 = NSMutableAttributedString()

let attrRegular = [NSAttributedStringKey.font : UIFont(name: "Palatino-Roman", size: 15)]

let attrBold:Dictionary = [NSAttributedStringKey.font : UIFont(name: "Raleway-SemiBold", size: 15)]

let attrBoldWithColor: Dictionary = [NSAttributedStringKey.font : UIFont(name: "Raleway-SemiBold", size: 15),
                                 NSAttributedStringKey.foregroundColor: UIColor.red]

if let regular = attrRegular as? [NSAttributedStringKey : NSObject]{
    part1 = NSMutableAttributedString(string: "first", attributes: regular)

}
if let bold = attrRegular as? [NSAttributedStringKey : NSObject]{
    part2 = NSMutableAttributedString(string: "second", attributes: bold)
}

if let boldWithColor = attrBoldWithColor as? [NSAttributedStringKey : NSObject]{
    part3 = NSMutableAttributedString(string: "third", attributes: boldWithColor)
}

combination.append(part1)
combination.append(part2)
combination.append(part3)

รายการคุณสมบัติโปรดดูที่นี่ NSAttributedStringKey บน Apple Docs


0

วิธีที่ง่ายสุด ๆ ในการทำเช่นนี้

let text = "This is a colorful attributed string"
let attributedText = 
NSMutableAttributedString.getAttributedString(fromString: text)
attributedText.apply(color: .red, subString: "This")
//Apply yellow color on range
attributedText.apply(color: .yellow, onRange: NSMakeRange(5, 4))

สำหรับรายละเอียดเพิ่มเติมคลิกที่นี่; https://github.com/iOSTechHub/AttributedString

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.