2011-02-02 16 views
5

Tôi có một UITextView có thể chỉnh sửa được. Bây giờ tôi có một yêu cầu đòi hỏi tôi phải tìm (như và khi tôi tiếp tục gõ) như khi dòng tiếp theo đã bắt đầu (có thể do tôi nhấn phím trả về, hoặc một dòng tự động wordwrap). Có thông báo nào có thể thu được để tìm ra khi dòng tiếp theo đã bắt đầu khi gõ không?UITextView (chỉnh sửa) - phát hiện sự kiện dòng tiếp theo xảy ra

Tôi đã thử tìm kiếm các giải pháp để tìm vị trí con trỏ trong chế độ xem văn bản nhưng sử dụng selectedRange và thuộc tính vị trí để tìm ra nó không giúp tôi. Không có sự tương quan nào giữa giá trị vị trí và một dòng mới. Giá trị vị trí chỉ tiếp tục tăng khi nhập. Bất kỳ ý tưởng?

Cảm ơn!

Trả lời

2

sẽ phát hiện dòng thay đổi từ bất cứ điều gì để nhấn "trở lại", backspacing để giảm dòng-count, gõ đến cuối dòng và một từ -wrap xảy ra, vv (* Lưu ý: PHẢI điều chỉnh các biến cho kích thước phông chữ, tôi khuyên bạn không nên sử dụng các con số được mã hóa cứng như trong ví dụ dưới đây).

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

Đại biểu sau được gọi bất cứ khi nào một văn bản mới được nhập trong textView.

Đặt các đại biểu cho UITextView, sau đó mã như sau

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

tôi đã sử dụng UITextViewTextDidChangeNotification. Và làm cách nào để tìm \ n trong văn bản? TextView.text không trả về toàn bộ chuỗi văn bản đã nhập cho đến nay chưa? Một linebreakwordwrap tự động có thể đã xảy ra hoặc tôi có thể đã đạt rất nhiều không gian. Làm cách nào để phát hiện sự xuất hiện của dòng tiếp theo trong ngữ cảnh đó? – Bourne

+0

@bourne: có phát hiện chìa khóa trả về một mình – KingofBliss

+5

Có. Nhưng nó phát hiện một dòng mới chỉ khi có một textView trống và điều đầu tiên bạn nhấn bên trong nó là một khóa trả về. Tôi đang tìm cách xử lý các kịch bản wordwrap textView multiline nơi wordwrap tự động gây ra một linebreak. Tôi muốn phát hiện sự kiện đó bằng cách nào đó. – Bourne

0

Thêm chế độ xem văn bản ẩn thứ hai vào chế độ xem của bạn. Triển khai thực hiện shouldChangeTextInRange cho chế độ xem văn bản có thể nhìn thấy và đặt văn bản trên chế độ xem ẩn thành văn bản mới. So sánh contentSize cho văn bản mới so với văn bản cũ để phát hiện từ bọc.

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

tôi là một chút muộn để đảng nhưng tôi có một yêu cầu tương tự, và sau một chút điều tra tôi thấy rằng KingofBliss 'câu trả lời kết hợp với

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

Did các trick cho tôi.

Bạn có thể đặt bất kỳ đối tượng như các đại biểu của người quản lý bố trí UITextView 's như vậy:

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

Hy vọng điều này sẽ Prover hữu ích.

4

Đối Swift sử dụng này

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 

    } 

Đối với Objective 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; 

} 
+0

hoạt động tốt cho nhanh nhưng cuộn phải được bật trên textView –

Các vấn đề liên quan