12

プロトコルをサポートするにはUIAccessibilityReadingContent、その行に関する質問に答える UITextView が必要です。これらは、実装する必要があるプロトコルのメソッドです。

  • accessibilityLineNumberForPoint:<- 座標を指定して行番号を返す
  • accessibilityContentForLineNumber:<- 指定された行のテキストを返します
  • accessibilityFrameForLineNumber:<- 行番号を指定して、そのフレームを返します
  • accessibilityPageContent<- テキスト コンテンツ全体。私が持っていること。:)

私は NSLayoutManager が私を助けることができると考えていますが、私はそれを経験していません。私はそれのいくつかを理解しました(私は思う)が、まだ助けが必要です。

Apple には、テキスト ビューの行数を取得できるサンプル コード ( here ) があります。

NSLayoutManager *layoutManager = [textView layoutManager];
unsigned numberOfLines, index, numberOfGlyphs =
        [layoutManager numberOfGlyphs];
NSRange lineRange;
for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++){
    (void) [layoutManager lineFragmentRectForGlyphAtIndex:index
            effectiveRange:&lineRange];
    index = NSMaxRange(lineRange);
}

lineRange上記で、このメソッドを使用して直線四角形を計算できると思いますNSLayoutManager:

- (NSRect)boundingRectForGlyphRange:(NSRange)glyphRange inTextContainer:(NSTextContainer *)container

そして、次lineRangesを使用してポイントの行番号を計算できるはずです(lineRangeグリフインデックスを含む を見つけることにより:

- (NSUInteger)glyphIndexForPoint:(CGPoint)point inTextContainer:(NSTextContainer *)container fractionOfDistanceThroughGlyph:(CGFloat *)partialFraction

では、行番号を指定して行の内容を ( として) 取得するにはどうすればよいNSStringでしょうか?

4

1 に答える 1

6

簡単な解決策を考えて、必要なものを再現する小さなコードを次に示します

- (void)analyse:(UITextView *)textView
{
    NSLayoutManager *layoutManager = [textView layoutManager];
    NSString *string = textView.text;
    unsigned numberOfLines, index, stringLength = [string length];

    NSMutableArray *ranges = [NSMutableArray new];
    NSMutableArray *frames = [NSMutableArray new];
    for (index = 0, numberOfLines = 0; index < stringLength; numberOfLines++)
    {
        NSRange tmprange;
        NSRange range = [string lineRangeForRange:NSMakeRange(index, 0)];
        CGRect rect = [layoutManager lineFragmentRectForGlyphAtIndex:index
                                           effectiveRange:&tmprange];

        [ranges addObject:[NSValue valueWithRange:range]];

        [frames addObject:[NSValue valueWithCGRect:rect]];
        index = NSMaxRange(tmpRange);
    }
    self.ranges = ranges;
    self.frames = frames;
    self.numberOfLines = numberOfLines;
}

プロパティを見てください:

self.ranges = ranges;
self.frames = frames;
self.numberOfLines = numberOfLines;

このプロパティを作成するには、クラスに次のものを含めることができます。

@property (nonatomic) NSInteger numberOfLines;
@property (strong, nonatomic) NSArray *ranges;
@property (strong, nonatomic) NSArray *frames;

次のデリゲート内に分析呼び出しを追加することをお勧めします。

- (void)textViewDidChange:(UITextView *)textView

たとえば、分析後に2行目のフレームを取得できます: self.frames[1]

または、2 行目のテキストを取得する: [textView.text substringWithRange:[self.ranges[1] rangeValue]]

たとえば、次のようにします。

if (self.numberOfLines > 1)
{
    NSRange range = [self.ranges[1] rangeValue];
    NSLog(@"2nd line = %@", [textView.text substringWithRange:range]);
    NSLog(@"2nd line frame = %@", self.frames[1]);
}

すべてのフレームをself.framesに入れると、他のことは簡単にできると思います。座標を使用して行番号を推測します。

于 2015-04-28T02:46:16.480 に答える