2016-05-25 19 views
7

私のiOSアプリケーションでは、NSAttributedStringを使用して箇条書きリストを生成しています。残念ながら、私は弾丸を見やすく見せることに苦労しています。私の最初の試みは、基本的には、このような文字列を使用して、箇条書きのために通常のテキストとUnicode文字を使用していた:NSAttributedStringとhtmlスタイリング(箇条書き整列)

var attributedString = NSMutableAttributedString(
    string: "Here is a list of bullets and a paragraph introducing them, note that this paragraph spans multiple lines\n" + 
    "• This is the first bullet\n" + 
    "• Here is a second bullet\n" + 
    "• And here is a third bullet with a lot of text such that it overflows to the next line" 
) 

結果は、このでした:弾丸がどのように見えるか私が好き

enter image description here

最後の箇条書きにあふれているテキストは前の行に揃えておかなければなりませんし、プレーンテキストでこれを達成する方法を理解できませんでした。

2番目の試みは、NSHTMLTextDocumentTypeを介してNSAttributedStringでhtmlを使用し、<ul><li>要素を使用して箇条書きを生成することでした。最初の問題を修正しますが、新しいものを導入

let content = "Here is a list of bullets and a paragraph introducing them, note that this paragraph spans multiple lines" + 
    "<ul>" + 
     "<li>This is the first bullet</li>" + 
     "<li>Here is a second bullet</li>" + 
     "<li>And here is a third bullet with a lot of text such that it overflows to the next line</li>" + 
    "</ul>" 
var attributedString = try! NSMutableAttributedString(
    data: content, 
    options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], 
    documentAttributes: nil 
) 

enter image description here

弾丸は、現在(左端と右のテキストの両方から)遠く離れています。私はアラインメント(<li style="text-indent: -10px;">)を修正するために典型的なhtml/cssトリックを使用しようとしましたが、それらのスタイルはNSAttributedStringによって無視されるようです。

追加のNSMutableParagraphStyleを使用してこれを修正しようとしましたが、それ以上の害を及ぼすようです。ここに私が試したものです:

var paragraphStyle = NSMutableParagraphStyle() 
paragraphStyle.firstLineHeadIndent = 0 
paragraphStyle.headIndent = 20 
attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: attributedStringRange) 

そして、ここでは、私が得たものである:

enter image description here

あなたが見ることができるように、それだけで物事を悪化させ、ここで私の問題は、次のとおりです。

  • 2行目をオフセットしますが、前の段落ではなく、箇条書きにのみその効果が欲しいです(効果が適用される範囲を減らすことで改善できると思います)
  • 私の例ではオフセットを推測/ハードコーディングする必要がありますが、現在のフォント設定では弾丸が変更されても足りません。
  • 何らかの理由で弾丸の間隔がさらに広がっています何の理由もありませんが、何もせずにバニラのNSParagraphStyleを適用するだけで、これを修正するオプションはありません。

私が本当に欲しいのは、二行目のオーバーフローインデントが正確なピクセル位置をハードコーディングすることなく、第二のように見えるようにしながら、私の弾丸間隔が最初のスクリーンショットのように見えるようにするためにあります。あなたは私を助けてくれますか?

私はリストにカスタムスタイルを追加する必要がありましたし、これは私が各弾丸のために使用してしまった段落スタイルでNSAttributedString

headIndentfirstLineHeadIndentを変更することができますおかげ

+0

あなたはこれに対して素晴らしい解決策を見つけられましたか? – flohei

+0

残念ながら、私は解決策が何であったか覚えていない、私はそれが投稿された答えのいくつかのバリエーションだと思う。私は、上の段落と箇条書きのリストのために別々の要素を使用することになったと思う。これはハックのようだが、もっと時間を費やす価値はない。私は参照してください –

+0

。 APIからテキスト全体を取得するときに避けようとしているのは、私が実際に劇的に変化する可能性があるため、結果を混乱させたくありません。だから、私はおそらく例外を超えて例外に終わるだろう。とにかく、お返事ありがとう! – flohei

答えて

4

しかしNSTextTab場所がなければなりませんこれはあなたの箇条書きが後\tを持っている(と仮定して動作します

NSMutableParagraphStyle *const bulletParagraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
bulletParagraphStyle.headIndent = 60; 
bulletParagraphStyle.firstLineHeadIndent = 30; 
NSTextTab *listTab = [[NSTextTab alloc] initWithTextAlignment:NSTextAlignmentNatural location:60 options:@{}]; 
bulletParagraphStyle.tabStops = @[listTab]; 

headIndent

と同じであることその後テキスト)

+1

ありがとう、これはほとんど今、私はちょうど上の段落のインデントを分けようとしています(今NSRangeを試していて、それは協調的ではないので、それを理解する)。 –

+0

同じ問題があり、html

レイアウトを使用して簡単に修正しましたが、実際にはテーブルを使用しないようにしました – Injectios

関連する問題