是否可以将左对齐和右对齐添加到字符串的不同部分?
我尝试将对齐属性添加到右侧部分:
NSMutableParagraphStyle *paragrahStyle = [[NSMutableParagraphStyle alloc] init];
[paragrahStyle setAlignment:NSTextAlignmentRight];
[mutableAttributedString addAttribute:NSParagraphStyleAttributeName value:paragrahStyle range:rangeOfDate];
但整个字符串与左边对齐。
答案 0 :(得分:39)
在代码中执行的操作是设置段落样式(从\ n到\ n的文本),并且在同一段落中不可能有多个文本对齐。我遇到了同样的问题,最终在iOS 6中使用了多个UILabel: - (
然而,在iOS 7中,我注意到ParagraphStyle的TabStops。这实际上使它成为可能,但我发现文档非常不合适。但是,我最终得到它的工作。您可以设置右对齐的TapStop,这会使您的文本呈现在指定停靠点的左侧(直到填充该空间)。为了让我的简单示例工作,我必须在第一段之外添加至少一个属性 - 它可能只是一个明确的背景的UIColor: - )
以下是UIView中的drawRect的一个简单示例:
- (void)drawRect:(CGRect)rect
{
NSString *str = @"to the left\tto the right\nleft again\tright again";
NSMutableAttributedString *att = [[NSMutableAttributedString alloc] initWithString:str];
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.maximumLineHeight = 12.0f;
paragraph.alignment = NSTextAlignmentLeft;
NSTextTab *t = [[NSTextTab alloc] initWithTextAlignment:NSTextAlignmentRight location:rect.size.width options:nil];
paragraph.tabStops = @[t];
[att addAttribute:NSBackgroundColorAttributeName value:[UIColor magentaColor] range:NSMakeRange(0, @"to the left".length)];
[att addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Trebuchet-BoldItalic" size:12.0] range:NSMakeRange(12, 5)];
[att addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(str.length - 4, 2)];
[att addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, str.length)];
[att drawInRect:rect];
}
该代码将呈现以下内容:
答案 1 :(得分:9)
以@Verglas的答案为基础......
您通常在HTML中执行此类操作的方式是通过浮动。 Something like this::
<div><p style='float: left;'>Left</p><p style='float: right;'>Right</p><div style='clear: both;'></div></div>
如果您可以将其转换为NSAttributedString并使其正常工作,那将会很棒:
NSString* html = @"<div><p style='float: left;'>Left</p><p style='float: right;'>Right</p><div style='clear: both;'></div></div>";
NSData* d = [html dataUsingEncoding: NSUTF8StringEncoding];
NSAttributedString* as = [[NSMutableAttributedString alloc] initWithData: d
options: @{
NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute : @(NSUTF8StringEncoding)
}
documentAttributes: nil
error: nil];
可悲的是,它不起作用。
对于第二次尝试,我们可以尝试使用HTML表格:
html = @"<table style='width:100%'><tr><td>Left</td><td style='text-align:right;'>Right</td></tr></table>";
奇怪的是,这是按预期工作的。它产生的属性更令人好奇的是:
2014-08-27 14:27:31.443 testParagraphStyles[2095:60b] range: {0, 5} attributes: {
NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n \"<NSTextTableBlock: 0x8d9c920>\"\n), Lists (null), BaseWritingDirection 0, HyphenationFactor 0, TighteningFactor 0, HeaderLevel 0";
2014-08-27 14:27:31.444 testParagraphStyles[2095:60b] range: {5, 6} attributes: {
NSParagraphStyle = "Alignment 2, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n \"<NSTextTableBlock: 0x8da1550>\"\n), Lists (null), BaseWritingDirection 0, HyphenationFactor 0, TighteningFactor 0, HeaderLevel 0";
}
向右滚动并注意对NSTextTableBlock的引用。 NSTextTable不是iOS上的公共API,但是NSAttributedString initWithData:options:documentAttributes:error:用它来从HTML生成我们的属性字符串。这很痛苦,因为这意味着我们无法手工构建NSAttributedString(我们必须使用此API从HTML生成它)。
从HTML构建属性字符串很慢且很大程度上没有文档记录。我随时可以避免它。