2013-09-25 19 views
1

回到我試圖用UITextView characterRangeAtPoint在我的代碼在TextView的內一些CGPoints得到UITextRanges。然後我使用中的UITextPositions作爲參數,並使用UITextView offsetFromPosition: toPosition:來獲得偏移量。它在iOS 6中運行良好。但是當我在iOS 7中嘗試它時,無論CGPoint我在textview中嘗試過,它總是會返回我offset 0在IOS 7,UITextView的offsetFromPosition:toPosition:總是UITextPositions的參數返回0,從UITextView的characterRangeAtPoint

下面是代碼:

// 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這是正確的。所以問題是從textview characterRangeAtPoint返回UITextRange。在IOS 7中,characterRangeAtPoint似乎沒有給出給定的CGPoint正確的文本範圍。所以textview offsetFromPosition: toPosition:無法返回正確的偏移量。

但我在IOS 6中使用了相同的代碼,它工作得很好。我也檢查了characterRangeAtPoint的參考資料,但沒有找到有用的信息。

有沒有人知道IOS7中characterRangeAtPoint發生了什麼?爲了使其功能與IOS 6中的一樣,我該怎麼做?

+0

相關/可能重複 - [檢測點擊字符。 UITextView characterRangeAtPoint總是返回nil](http://stackoverflow.com/q/18925755)。 – Dukeling

+0

可能的重複[Detecting tapped character。 UITextView characterRangeAtPoint總是返回nil](http://stackoverflow.com/questions/18925755/detecting-tapped-character-uitextview-characterrangeatpoint-always-returns-nil) –

回答

1

我遇到了同樣的問題。我發現characterRangeAtPoint不會返回一個值,除非文本在iOS 7的TextView中至少被更改或選擇了一次。 我不能使這個函數正常工作,所以我不得不使用它(我嘗試過以設置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); 
+0

對不起boatflag,我只是意識到你已經知道了。 –

+0

非常感謝您的回覆!當我搜索這個主題時,我發現了這些信息。所以你會介意讓我知道你是如何解決你的問題的?我還發現closestPositionToPoint也和characterRangeAtPoint類似。即使沒有選擇textview,它也可以返回正確的值。然而,當你傳遞給這個方法的點越大(在我的測試案例中,該點的y超過260pt),返回值就不正確。這太奇怪了......在iOS 6中,closestPositionToPoint工作得很好。 – boatflag

+0

@boatflag,我希望這有助於:) –

1

設置你的TextView

的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); 
+0

感謝您的回覆!我試過你的代碼,但偏移量仍然是0.你能解釋一下contentInset如何影響characterRangeAtPoint嗎?謝謝! – boatflag

+0

這個代碼是在Ios7中工作的,我已經檢查過了.....請更改CGPointMake(10000,10000) – Deepesh

+0

我不知道爲什麼地雷不工作......並將CGPoint改爲(10000,10000)使得textview之外的點(我也試過,仍然返回0)。根據我的代碼中的textview,我認爲(100,100)是合理的位置,並且我可以在iOS 6設備上獲得正確的偏移量。你能告訴我爲什麼setContentInset會影響characterRangeAtPoint返回的結果嗎? – boatflag

1

我發現這個bug解決方法,併發布瞭解決方案,以this question答覆。

下面是一個複製粘貼:


這是一款iOS 7的bug。 characterRangeAtPoint:總是返回nil,除非事先選擇了文本。

作爲一種解決方法,您可以事先撥打setSelectedRange:setSelectedTextRange:,但textView會突出顯示您的選擇。我想出了以下解決方案:

[textView select:textView]; 
[textView setSelectedTextRange:nil]; 

在調用這兩個方法,如預期characterRangeAtPoint:將開始工作。

請注意,您只需在textView初始化後調用一次。

+0

僅僅複製[so]上的另一個答案的內容並不是特別適合作爲答案。如果你覺得這個問題是另一個問題的重複,你應該這樣標記它。 – Dukeling

+0

@Dukeling,我沒有足夠的知名度將問題標記爲重複,並且我覺得「鏈接加粘貼」方法會是一個體面的妥協(考慮到我粘貼自己的答案,而不是其他人的答案)。 –

+0

我添加了一個鏈接作爲對該問題的評論,並且我將此帖標記爲刪除。 – Dukeling

0

我遇到了最近爲7.1.1開發的相同問題(仍然不是固定的...),並想分享我的簡單解決方案。

我試過Exile.90做了什麼,但沒有奏效。

相反,我在故事板中啓用了文本選擇,並在viewDidLoad期間禁用了它。沒有選擇發生,但受影響的功能現在對我來說是完美的。