2010-09-07 77 views
6

Sử dụng mã bên dưới, tôi đặt văn bản từ một plist vào một textView. TextView vẫn chưa được xây dựng; văn bản ban đầu chỉ đọc. Trong iOS4, mã goToEndOfNote định vị con trỏ ở cuối văn bản VÀ cuộn đến vị trí đó. Trong 3.1.3 nó không di chuyển đến cuối cho đến khi màn hình được chạm (không bắt buộc trừ khi cần thay đổi hoặc bổ sung), làm cho trình theo dõi văn bản của textView. Tôi muốn nó làm việc trong 3.1.3 như trong 4.0. Bất kỳ ý tưởng xin vui lòng. Cảm ơn.Vị trí con trỏ đến cuối văn bản trong uitextview và cuộn đến vị trí

... 
    self.temp = [[[NSMutableArray alloc] initWithContentsOfFile:myPlistPath] autorelease]; 
    self.textView.text = [self.temp objectAtIndex:0]; 
    [self goToEndOfNote]; 
    //[self performSelector:@selector(goToEndOfNote) withObject:nil afterDelay:0.1]; 
} 

- (void) goToEndOfNote { 
    NSUInteger length = self.textView.text.length; 
    self.textView.selectedRange = NSMakeRange(length, 0); 
} 

Trả lời

3

Tôi sử dụng setContentOffset:animated để cuộn lên đầu UITextView trong một trong các ứng dụng của tôi. Nên hoạt động để cuộn xuống dưới cùng. Hãy thử:

- (void) goToEndOfNote { 
    NSUInteger length = self.textView.text.length; 
    self.textView.selectedRange = NSMakeRange(length, 0); 
    [textView setContentOffset:CGPointMake(0, length) animated:YES]; 
} 

Bạn cũng có thể quấn đó lên để nó chỉ xảy ra cho 3.1.3 và dưới đây:

- (void) goToEndOfNote { 
    NSUInteger length = self.textView.text.length; 
    self.textView.selectedRange = NSMakeRange(length, 0); 
    NSString* systemVersion = [[UIDevice currentDevice] systemVersion]; 
    float version = [systemVersion floatValue]; 
    if (version < 3.2) { 
     [textView setContentOffset:CGPointMake(0, length) animated:YES]; 
    } 
} 
+0

Hầu như không hoàn toàn. Textview là phần lớn màn hình. Trong 4.0 dòng add'l [textView setContentOffset: CGPointMake (0, length) hoạt hình: YES]; khiến ký tự cuối cùng cuộn xuống cuối textView (tốt). Trong 3.1.3, nó làm cho ký tự cuối cùng di chuyển đến khoảng giữa chừng trên màn hình (ok) nhưng trong cả hai phiên bản hệ điều hành, nếu chỉ có 1 hoặc 2 dòng trên màn hình, chúng được cuộn ra khỏi màn hình (không phải như vậy tốt). Tôi muốn di chuyển để bắt đầu chỉ sau khi một screenful là hiện tại (như nó trong 4,0 chỉ với 2 dòng ban đầu trong phương pháp của tôi). –

2

Không chắc nếu điều này là câu trả lời nhưng nó hoạt động.

Trong 3.1.3, với mã gốc, con trỏ ở cuối nhưng cuộn ở trên cùng. Trong 4.0, cả hai đều ở dưới cùng.

NSUInteger length = self.textView.text.length; 
self.textView.selectedRange = NSMakeRange(length, 0); 

Sau đó, tôi nhận thấy trong 3.1.3, chuyển 0 và độ dài, cuộn ở dưới cùng nhưng con trỏ ở trên cùng.

NSUInteger length = self.textView.text.length; 
self.textView.selectedRange = NSMakeRange(0, length); 

Đưa cả hai hoạt động cùng nhau. Nó cuộn xuống đáy NSMakeRange (0, chiều dài) có lẽ đến cuối của dãy núi này, thì NSMakeRange (chiều dài, 0) đặt con trỏ ở đó, tất cả không có thay đổi để những gì nó làm trong 4,0

NSUInteger length = self.textView.text.length; 
self.textView.selectedRange = NSMakeRange(0, length); 
self.textView.selectedRange = NSMakeRange(length, 0); 
1

Bạn có thể sử dụng [UITextView -setSelectedRange:] để đặt phạm vi (vị trí = TEXT_VIEW_STRING_LENGTH, độ dài = 0) để đưa con trỏ đến cuối văn bản và sau đó gọi [UITextView -scrollRangeToVisible:] với cùng phạm vi để di chuyển con trỏ đến hiển thị.

1

Đã muộn nhưng tôi đã tìm được giải pháp làm việc cho việc này. nó cần một chút hack

- (void) textViewDidBeginEditing:(UITextView*)textview 
{ 
    [self performSelector:@selector(placeCursorAtEnd:) withObject:textview afterDelay:0.01]; 
} 

- (void)placeCursorAtEnd:(UITextView *)textview 
{ 
    NSUInteger length = textview.text.length; 

    textview.selectedRange = NSMakeRange(length, 0); 

    [textView setContentOffset:CGPointMake(0, length) animated:YES]; 
} 
+0

Sạch hơn nhiều khi bạn sử dụng 'dispatch_after()' vì nó lưu một phương thức và giữ kích hoạt và hành động cùng nhau. –

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