2011-02-02 62 views
5

我有一個可編輯的UITextView。現在我有一個要求,要求我查找下一行何時開始(可能是由於我點擊了返回鍵或自動換行符)。是否有任何通知可以得出以確定下一行在打字時何時開始?UITextView(編輯) - 檢測到發生下一行事件

我試圖尋找解決方案來找出在textview中的光標位置,但使用selectedRange和位置屬性來找出它並不能幫助我。位置值與新行之間沒有任何關聯。打字的位置值只是不斷增加。有任何想法嗎?

謝謝!

回答

2

將檢測線從東西變成打「迴歸」,退格,以減少線路數,輸入到行和單詞的結尾(*注意:必須調整字體大小的變量,我建議不要使用硬編碼數字,如下面的示例中所示)。

previousNumberOfLines = ((hiddenText.contentSize.height-37+21)/(21));//numbers will change according to font size 
NSLog(@"%i", previousNumberOfLines); 
10

無論何時在textView中輸入新文本,都會調用以下代理。

設置委託UITextView的,那麼代碼如下

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text; 
{ 
    if ([text isEqualToString:@"\n"]) { 
     //Do whatever you want 
    } 
    return YES; 
} 
+2

我已經使用UITextViewTextDidChangeNotification。我如何在文本中查找\ n? textView.text不會返回到目前爲止輸入的整個文本類型嗎?一個自動換行術語包裝可能已經發生,或者我可能碰到了很多空間。在這種情況下,如何檢測下一行的到達? – Bourne 2011-02-02 12:24:22

+0

@bourne:是它的檢測返回鍵 – KingofBliss 2011-02-02 12:39:26

0

爲您的視圖添加第二個隱藏文本視圖。爲可見文本視圖實現shouldChangeTextInRange,並將隱藏視圖上的文本設置爲新文本。比較新舊文本的contentSize以檢測文字換行。

0
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 
replacementText:(NSString *)text 
{ 

    if ([text isEqualToString:@"\n"]) { 
     textView.text=[NSString stringWithFormat:@"%@\n",textView.text]; 
     // Return FALSE so that the final '\n' character doesn't get added 
     return NO; 
    } 
    // For any other character return TRUE so that the text gets added to the view 
    return YES; 
} 
0

我有點遲到了,但我也有類似的要求,有點調查後,我發現,KingofBliss的回答與

-[id<NSLayoutManagerDelegate> layoutManager:shouldBreakLineByWordBeforeCharacterAtIndex:]; 
-[id<NSLayoutManagerDelegate> layoutManager:shouldBreakLineByHyphenatingBeforeCharacterAtIndex:]; 

結合奏效了我。

您可以設置任何對象作爲UITextView的佈局管理器的代表,像這樣:

textView.textContainer.layoutManager.delegate = (id<NSLayoutManagerDelegate>)delegate 

希望這將證明是有用的。

4

對於斯威夫特利用這個

previousRect = CGRectZero 

func textViewDidChange(textView: UITextView) { 

     var pos = textView.endOfDocument 
     var currentRect = textView.caretRectForPosition(pos) 
     if(currentRect.origin.y > previousRect?.origin.y){ 
      //new line reached, write your code 
     } 
     previousRect = currentRect 

    } 

對於目標C

CGRect previousRect = CGRectZero; 
- (void)textViewDidChange:(UITextView *)textView{ 

    UITextPosition* pos = textView.endOfDocument; 
    CGRect currentRect = [textView caretRectForPosition:pos]; 

    if (currentRect.origin.y > previousRect.origin.y){ 
      //new line reached, write your code 
     } 
    previousRect = currentRect; 

}