1

テキストビュー内のいくつかUITextView characterRangeAtPointを取得するためにコードで使用しようとしていました。そして、それらを引数として使用し、オフセットを取得するために使用しました。iOS 6 では問題なく動作しましたが、iOS 7 で試してみると、テキストビュー内で何を試しても常に返されました。UITextRangesCGPointsUITextPositionsUITextRangesUITextView offsetFromPosition: toPosition:offset 0CGPoint

コードは次のとおりです。

// init the textview
textview = [[UITextView alloc] initWithFrame:CGRectMake(10, 50, 300, 500)];
textview.backgroundColor = [UIColor whiteColor];
[self.view addSubview:textview];

// load the txt file for testing  
NSError *error;
NSString *content = [[NSString alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"] encoding:NSUTF8StringEncoding error:&error];
if (error) {
    NSLog(@"load string error:%@", [error localizedFailureReason]);
    return;
}

// set the text and font
textview.text = content;
UIFont *font = [UIFont systemFontOfSize:18];
textview.font = font;

// get text range at point (100, 100) and string offset from the beginning to this point 
UITextRange *textrange = [textview characterRangeAtPoint: CGPointMake(100, 100)];
NSInteger offset = [textview offsetFromPosition:textview.beginningOfDocument toPosition:textrange.start];
NSLog(@"offset = %d", offset);

返されたのoffsetは常に0でした。が原因かどうかをテストするためにUITextView offsetFromPosition: toPosition:、次のコードを試しました。

NSInteger offset1 = [textview offsetFromPosition:textview.beginningOfDocument toPosition:textview.endOfDocument];
NSLog(@"offset1 = %d", offset1);

それは私が使用offset1 = 5264したものによれば正しかったtest.txtです。したがって、問題は からUITextRange返されたものtextview characterRangeAtPointです。IOS 7characterRangeAtPointでは、指定された で正しいテキスト範囲が返されなかったようですCGPoint。そのtextview offsetFromPosition: toPosition:ため、正しいオフセットを返すことができませんでした。

しかし、IOS 6 で同じコードを使用したところ、非常にうまく機能しました。のリファレンスも確認しcharacterRangeAtPointましたが、有用な情報は見つかりませんでした。

characterRangeAtPointIOS 7 で何が起こったのか知っている人はいますか? IOS 6 と同じように機能させるには、どうすればよいですか?

4

4 に答える 4

1

テキストビューの setContentInset を設定します

このコードを試してください

UITextRange *textrange = [textview characterRangeAtPoint: CGPointMake(100, 100)];
NSInteger offset = [textview offsetFromPosition:textview.beginningOfDocument toPosition:textrange.start];

[textview setContentInset:UIEdgeInsetsMake(-45, 0, 5,0)];

NSLog(@"offset = %d", offset);
于 2013-09-25T10:51:49.653 に答える
1

同じ問題に遭遇しました。そして、IOS 7 の TextView でテキストが少なくとも 1 回変更または選択されていない限り、characterRangeAtPoint は値を返さないことがわかりました。 setContentInset も設定しますが、うまくいきません)。そして、ここに私の回避策があります。状況に合わせて似たようなものを作ることができると思います。

// get the beginning position of the current line.
NSRange pos = [textView.text rangeOfString:@"\n" options:NSBackwardsSearch range:NSMakeRange(0,textView.selectedRange.location)];
if (pos.location == NSNotFound) pos.location = 0; // if the text has only one line.
NSLog(@"pos = %d",pos.location);
于 2013-10-03T09:42:54.200 に答える
0

私は最近 7.1.1 の開発中に同じ問題に遭遇していました (まだ修正されていません...)。私の簡単な解決策を共有したいと思いました。

What Exile.90 を試してみましたが、うまくいきませんでした。

代わりに、ストーリーボードでテキスト選択を有効にし、viewDidLoad 中に無効にしました。選択は行われませんが、影響を受ける機能は完全に機能しています。

于 2014-07-07T23:50:18.057 に答える