NSAttributedString插入一个子弹点?

所以我有一个NSAttributedString我想在一部分文本的开头插入一个bullet point 。 我怎样才能做到这一点? 如何在显示文本时创建一个创建此项目符号点的CTPAragraphStyle

编辑:应该可以在iOS上使用

简单的一点:[mutableAttributedString insertAttributedString:@“•\ t”atIndex:0];

硬位。 以下几行。 (这是从一个更大的项目中提取的,但它可能会给你一个不错的开始。)

 NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:@"•\texample bullet fill out the text to check what happens on the second line and make sure it is lining up OK"]; CTTextAlignment alignment = kCTLeftTextAlignment; CGFloat paragraphSpacing = 0.0; CGFloat paragraphSpacingBefore = 0.0; CGFloat firstLineHeadIndent = 15.0; CGFloat headIndent = 30.0; CGFloat firstTabStop = 15.0; // width of your indent CGFloat lineSpacing = 0.45; CTTextTabRef tabArray[] = { CTTextTabCreate(0, firstTabStop, NULL) }; CFArrayRef tabStops = CFArrayCreate( kCFAllocatorDefault, (const void**) tabArray, 1, &kCFTypeArrayCallBacks ); CFRelease(tabArray[0]); CTParagraphStyleSetting altSettings[] = { { kCTParagraphStyleSpecifierLineSpacing, sizeof(CGFloat), &lineSpacing}, { kCTParagraphStyleSpecifierAlignment, sizeof(CTTextAlignment), &alignment}, { kCTParagraphStyleSpecifierFirstLineHeadIndent, sizeof(CGFloat), &firstLineHeadIndent}, { kCTParagraphStyleSpecifierHeadIndent, sizeof(CGFloat), &headIndent}, { kCTParagraphStyleSpecifierTabStops, sizeof(CFArrayRef), &tabStops}, { kCTParagraphStyleSpecifierParagraphSpacing, sizeof(CGFloat), &paragraphSpacing}, { kCTParagraphStyleSpecifierParagraphSpacingBefore, sizeof(CGFloat), &paragraphSpacingBefore} }; CTParagraphStyleRef style; style = CTParagraphStyleCreate( altSettings, sizeof(altSettings) / sizeof(CTParagraphStyleSetting) ); if ( style == NULL ) { NSLog(@"*** Unable To Create CTParagraphStyle in apply paragraph formatting" ); return; } [string addAttributes:[NSDictionary dictionaryWithObjectsAndKeys:(NSObject*)style,(NSString*) kCTParagraphStyleAttributeName, nil] range:NSMakeRange(0,[string length])]; CFRelease(tabStops); CFRelease(style); 

您需要包含CoreText框架,然后导入CoreText / CoreText.h

这是一个更现代的方法,适用于iOS6:

 NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:@"•\texample bullet fill out the text to check what happens on the second line and make sure it is lining up OK"]; NSMutableParagraphStyle *paragraphStyle; paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [paragraphStyle setTabStops:@[[[NSTextTab alloc] initWithTextAlignment:NSTextAlignmentLeft location:15 options:nil]]]; [paragraphStyle setDefaultTabInterval:15]; [paragraphStyle setFirstLineHeadIndent:0]; [paragraphStyle setHeadIndent:15]; [string addAttributes:@{NSParagraphStyleAttributeName: paragraphStyle} range:NSMakeRange(0,[string length])]; 

这是Swift很好的解决方案

 let label = UILabel() label.frame = CGRect(x: 40, y: 100, width: 280, height: 600) label.textColor = UIColor.lightGray label.numberOfLines = 0 let arrayString = [ "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.", "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." ] label.attributedText = add(stringList: arrayString, font: label.font, bullet: "") self.view.addSubview(label) 

添加项目符号

Swift 4.2 ++

 func add(stringList: [String], font: UIFont, bullet: String = "\u{2022}", indentation: CGFloat = 20, lineSpacing: CGFloat = 2, paragraphSpacing: CGFloat = 12, textColor: UIColor = .gray, bulletColor: UIColor = .green) -> NSAttributedString { let textAttributes: [NSAttributedString.Key: Any] = [NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: textColor] let bulletAttributes: [NSAttributedString.Key: Any] = [NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: bulletColor] let paragraphStyle = NSMutableParagraphStyle() let nonOptions = [NSTextTab.OptionKey: Any]() paragraphStyle.tabStops = [ NSTextTab(textAlignment: .left, location: indentation, options: nonOptions)] paragraphStyle.defaultTabInterval = indentation //paragraphStyle.firstLineHeadIndent = 0 //paragraphStyle.headIndent = 20 //paragraphStyle.tailIndent = 1 paragraphStyle.lineSpacing = lineSpacing paragraphStyle.paragraphSpacing = paragraphSpacing paragraphStyle.headIndent = indentation let bulletList = NSMutableAttributedString() for string in stringList { let formattedString = "\(bullet)\t\(string)\n" let attributedString = NSMutableAttributedString(string: formattedString) attributedString.addAttributes( [NSAttributedString.Key.paragraphStyle : paragraphStyle], range: NSMakeRange(0, attributedString.length)) attributedString.addAttributes( textAttributes, range: NSMakeRange(0, attributedString.length)) let string:NSString = NSString(string: formattedString) let rangeForBullet:NSRange = string.range(of: bullet) attributedString.addAttributes(bulletAttributes, range: rangeForBullet) bulletList.append(attributedString) } return bulletList } 

Swift 4.0和4.1

 func add(stringList: [String], font: UIFont, bullet: String = "\u{2022}", indentation: CGFloat = 20, lineSpacing: CGFloat = 2, paragraphSpacing: CGFloat = 12, textColor: UIColor = .gray, bulletColor: UIColor = .green) -> NSAttributedString { let textAttributes: [NSAttributedStringKey: Any] = [NSAttributedStringKey.font: font, NSAttributedStringKey.foregroundColor: textColor] let bulletAttributes: [NSAttributedStringKey: Any] = [NSAttributedStringKey.font: font, NSAttributedStringKey.foregroundColor: bulletColor] let paragraphStyle = NSMutableParagraphStyle() let nonOptions = [NSTextTab.OptionKey: Any]() paragraphStyle.tabStops = [ NSTextTab(textAlignment: .left, location: indentation, options: nonOptions)] paragraphStyle.defaultTabInterval = indentation //paragraphStyle.firstLineHeadIndent = 0 //paragraphStyle.headIndent = 20 //paragraphStyle.tailIndent = 1 paragraphStyle.lineSpacing = lineSpacing paragraphStyle.paragraphSpacing = paragraphSpacing paragraphStyle.headIndent = indentation let bulletList = NSMutableAttributedString() for string in stringList { let formattedString = "\(bullet)\t\(string)\n" let attributedString = NSMutableAttributedString(string: formattedString) attributedString.addAttributes( [NSAttributedStringKey.paragraphStyle : paragraphStyle], range: NSMakeRange(0, attributedString.length)) attributedString.addAttributes( textAttributes, range: NSMakeRange(0, attributedString.length)) let string:NSString = NSString(string: formattedString) let rangeForBullet:NSRange = string.range(of: bullet) attributedString.addAttributes(bulletAttributes, range: rangeForBullet) bulletList.append(attributedString) } return bulletList } 

结果如下:

在此处输入图像描述

您没有在iOS中实现带有段落样式的项目符号列表。 根据需要设置制表位,然后在段落的开头插入制表符,项目符号,制表符。

CTParagraphStyle非常不灵活,因此您不能只添加您选择的新样式。 但是,您可以将任何您喜欢的属性( MYBulletStyle )添加到MYBulletStyle中的任意运行中。 这对于使用NSAttributedString传递项目符号列表信息,然后在您准备好显示它时重建字符串以包含项目符号非常有用。 但Core Text不会自动为您渲染项目符号。

不是这个问题的实际答案,但这可以帮助。

只需添加“•”

即使我正在为我的textView寻找类似的东西。 我做了什么,只是在我的字符串上面附加字符串并将其传递给我的textView,同样可以为标签做。 我为将来的Viewer回答了这个问题。

这是Krunal在Objective-C中的出色答案。 它还会删除最后一个项目符号上的段落间距,以避免UILabel上的额外底部填充。

 UILabel *label = [UILabel new]; label.frame = CGRectMake(40, 100, 280, 600); label.textColor = UIColor.lightGrayColor; label.numberOfLines = 0; NSArray *stringArray = @[@"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", @"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", @"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.", @"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." ]; label.attributedText = [self attributedStringForBulletTexts:stringArray withFont:label.font bulletString:@"" indentation:20 lineSpacing:2 paragraphSpacing:12 textColor:UIColor.grayColor bulletColor:UIColor.greenColor]; 

这是创建实际属性文本的函数:

 - (NSAttributedString *)attributedStringForBulletTexts:(NSArray *)stringList withFont:(UIFont *)font bulletString:(NSString *)bullet indentation:(CGFloat)indentation lineSpacing:(CGFloat)lineSpacing paragraphSpacing:(CGFloat)paragraphSpacing textColor:(UIColor *)textColor bulletColor:(UIColor *)bulletColor { NSDictionary *textAttributes = @{NSFontAttributeName: font, NSForegroundColorAttributeName: textColor}; NSDictionary *bulletAttributes = @{NSFontAttributeName: font, NSForegroundColorAttributeName: bulletColor}; NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new]; paragraphStyle.tabStops = @[[[NSTextTab alloc] initWithTextAlignment: NSTextAlignmentLeft location:indentation options:@{}]]; paragraphStyle.defaultTabInterval = indentation; paragraphStyle.lineSpacing = lineSpacing; paragraphStyle.paragraphSpacing = paragraphSpacing; paragraphStyle.headIndent = indentation; NSMutableAttributedString *bulletList = [NSMutableAttributedString new]; for (NSString *string in stringList) { NSString *formattedString = [NSString stringWithFormat:@"%@\t%@\n", bullet, string]; NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:formattedString]; if (string == stringList.lastObject) { paragraphStyle = [paragraphStyle mutableCopy]; paragraphStyle.paragraphSpacing = 0; } [attributedString addAttributes:@{NSParagraphStyleAttributeName: paragraphStyle} range:NSMakeRange(0, attributedString.length)]; [attributedString addAttributes:textAttributes range:NSMakeRange(0, attributedString.length)]; NSRange rangeForBullet = [formattedString rangeOfString:bullet]; [attributedString addAttributes:bulletAttributes range:rangeForBullet]; [bulletList appendAttributedString:attributedString]; } return bulletList; }