web-dev-qa-db-ja.com

NSMutableAttributedStringは異なる配置を追加します

文字列の異なる部分に左右の配置を追加することは可能ですか?

右側の部分に配置属性を追加しようとしました:

    NSMutableParagraphStyle *paragrahStyle = [[NSMutableParagraphStyle alloc] init];
    [paragrahStyle setAlignment:NSTextAlignmentRight];
    [mutableAttributedString addAttribute:NSParagraphStyleAttributeName value:paragrahStyle range:rangeOfDate];

ただし、文字列全体が左揃えになります。

14
Shmidt

コードで行うことは、段落スタイル(\ nから\ nまでのテキスト)を設定することであり、同じ段落に複数のテキストの配置を設定することはできません。私は同じ問題を抱えていて、iOS6で複数のUILabelを使用することになりました:-(

しかし、iOS 7では、ParagraphStyleのTabStopsに気づきました。これは実際にそれを可能にします、しかし私はドキュメントがかなり不十分であると思います。しかし、私はそれを機能させることになりました。右揃えのTapStopを設定できます。これにより、テキストが指定したストップの左側にレンダリングされます(そのスペースがいっぱいになるまで)。私の簡単な例を機能させるために、段落1のほかに少なくとももう1つの属性を追加する必要がありました-それは背景の明確な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];
}

そのコードは以下をレンダリングします:

enter image description here

40
jayjunck

@Verglasの答えに基づいて構築しています...

HTMLで通常このようなことを行う方法は、フローティングを使用することです。 このようなもの:

<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];

悲しいことに、それは機能しません。

2回目の試行では、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から属性付き文字列を作成するのは時間がかかり、ほとんど文書化されていません。私はできる限りそれを避けます。

9
TomSwift