拆分属性字符串并保留格式
Split Attributed String and Retain Formatting
如何使用现有的 NSAttributedString 并根据预定义的分隔符对其进行划分,同时保持格式不变? componentsSeparatedByString 似乎不会对 NSAttributedString 进行操作。
我当前的解决方法在正确的点生成拆分,但只输出一个 NSString。从而丢失格式。
NSData *rtfFileData = [NSData dataWithContentsOfFile:path];
NSAttributedString *rtfFileAttributedString = [[NSAttributedString alloc] initWithData:rtfFileData options:@{NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType} documentAttributes:nil error:nil];
NSString *rtfFileString = [rtfFileAttributedString string];
NSString *importSeparator = @"###";
// Wish I could do this
// NSArray *separatedArray = [rtfFileAttributedString componentsSeparatedByString:importSeparatorPref];
NSArray *separatedArray = [rtfFileString componentsSeparatedByString:importSeparatorPref];
NSLog( @"Separated array: %@", separatedArray );
您可以使用拆分的非属性字符串来拆分属性字符串。一种选择是:
NSData *rtfFileData = [NSData dataWithContentsOfFile:path];
NSAttributedString *rtfFileAttributedString = [[NSAttributedString alloc] initWithData:rtfFileData options:@{NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType} documentAttributes:nil error:nil];
NSString *rtfFileString = [rtfFileAttributedString string];
NSString *importSeparator = @"###";
NSArray *separatedArray = [rtfFileString componentsSeparatedByString:importSeparatorPref];
NSMutableArray *separatedAttributedArray = [NSMutableArray arrayWithCapacity:separatedArray.count];
NSInteger start = 0;
for (NSString *sub in separatedArray) {
NSRange range = NSMakeRange(start, sub.length);
NSAttributedString *str = [rtfFileAttributedString attributedSubstringFromRange:range];
[separatedAttributedArray addObject:str];
start += range.length + importSeparator.length;
}
NSLog(@"Separated attributed array: ", separatedAttributedArray);
在swift中答案很简单。
var string = NSAttributedString(
string: "This string is shorter than it should be for this questions answer.",
attributes: [.font: UIFont.systemFont(ofSize: 12)]
)
let range = NSRange(location: 0, length: 120)
let newString = string.attributedSubstring(from: range)
print(newString)
在Swift4中,我做了函数
func splitAttributedString(inputString: NSAttributedString, seperateBy: String) -> [NSAttributedString] {
let input = inputString.string
let separatedInput = input.components(separatedBy: seperateBy)
var output = [NSAttributedString]()
var start = 0
for sub in separatedInput {
let range = NSMakeRange(start, sub.utf16.count)
let attribStr = inputString.attributedSubstring(from: range)
output.append(attribStr)
start += range.length + seperateBy.count
}
return output
}
这是一个 NSAttributedString
扩展,其工作方式与此处的其他一些示例类似。
private extension NSAttributedString {
func components(separatedBy separator: String) -> [NSAttributedString] {
var result = [NSAttributedString]()
let separatedStrings = string.components(separatedBy: separator)
var range = NSRange(location: 0, length: 0)
for string in separatedStrings {
range.length = string.utf16.count
let attributedString = attributedSubstring(from: range)
result.append(attributedString)
range.location += range.length + separator.utf16.count
}
return result
}
}
如何使用现有的 NSAttributedString 并根据预定义的分隔符对其进行划分,同时保持格式不变? componentsSeparatedByString 似乎不会对 NSAttributedString 进行操作。
我当前的解决方法在正确的点生成拆分,但只输出一个 NSString。从而丢失格式。
NSData *rtfFileData = [NSData dataWithContentsOfFile:path];
NSAttributedString *rtfFileAttributedString = [[NSAttributedString alloc] initWithData:rtfFileData options:@{NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType} documentAttributes:nil error:nil];
NSString *rtfFileString = [rtfFileAttributedString string];
NSString *importSeparator = @"###";
// Wish I could do this
// NSArray *separatedArray = [rtfFileAttributedString componentsSeparatedByString:importSeparatorPref];
NSArray *separatedArray = [rtfFileString componentsSeparatedByString:importSeparatorPref];
NSLog( @"Separated array: %@", separatedArray );
您可以使用拆分的非属性字符串来拆分属性字符串。一种选择是:
NSData *rtfFileData = [NSData dataWithContentsOfFile:path];
NSAttributedString *rtfFileAttributedString = [[NSAttributedString alloc] initWithData:rtfFileData options:@{NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType} documentAttributes:nil error:nil];
NSString *rtfFileString = [rtfFileAttributedString string];
NSString *importSeparator = @"###";
NSArray *separatedArray = [rtfFileString componentsSeparatedByString:importSeparatorPref];
NSMutableArray *separatedAttributedArray = [NSMutableArray arrayWithCapacity:separatedArray.count];
NSInteger start = 0;
for (NSString *sub in separatedArray) {
NSRange range = NSMakeRange(start, sub.length);
NSAttributedString *str = [rtfFileAttributedString attributedSubstringFromRange:range];
[separatedAttributedArray addObject:str];
start += range.length + importSeparator.length;
}
NSLog(@"Separated attributed array: ", separatedAttributedArray);
在swift中答案很简单。
var string = NSAttributedString(
string: "This string is shorter than it should be for this questions answer.",
attributes: [.font: UIFont.systemFont(ofSize: 12)]
)
let range = NSRange(location: 0, length: 120)
let newString = string.attributedSubstring(from: range)
print(newString)
在Swift4中,我做了函数
func splitAttributedString(inputString: NSAttributedString, seperateBy: String) -> [NSAttributedString] {
let input = inputString.string
let separatedInput = input.components(separatedBy: seperateBy)
var output = [NSAttributedString]()
var start = 0
for sub in separatedInput {
let range = NSMakeRange(start, sub.utf16.count)
let attribStr = inputString.attributedSubstring(from: range)
output.append(attribStr)
start += range.length + seperateBy.count
}
return output
}
这是一个 NSAttributedString
扩展,其工作方式与此处的其他一些示例类似。
private extension NSAttributedString {
func components(separatedBy separator: String) -> [NSAttributedString] {
var result = [NSAttributedString]()
let separatedStrings = string.components(separatedBy: separator)
var range = NSRange(location: 0, length: 0)
for string in separatedStrings {
range.length = string.utf16.count
let attributedString = attributedSubstring(from: range)
result.append(attributedString)
range.location += range.length + separator.utf16.count
}
return result
}
}