2011-08-25 33 views
7

Tôi có một ứng dụng có chế độ xem có các trường văn bản từ đầu chế độ xem đến cuối chế độ xem. Tôi cần nó để di chuyển khi chỉnh sửa các lĩnh vực dưới cùng để các lĩnh vực sẽ được nhìn thấy, nhưng nó không có vẻ hoạt động chính xác.Bàn phím Di chuyển trên Trường Văn bản Hoạt động - Cuộn xuống Chế độ Ngắm?

Sau Apple docs, tôi đặt tất cả mã đó vào chương trình của mình (Liệt kê 4-1, 4-2) và thêm các cửa hàng scrollViewactiveField vào tệp tiêu đề của tôi và liên kết chúng với IB.

Sự cố xảy ra ngay khi tôi nhấp vào trường văn bản, TẤT CẢ các trường văn bản sẽ không hiển thị cho đến khi tôi loại bỏ bàn phím. Chúng cuộn xuống rất xa (một lần nữa, đủ xa để không thể nhìn thấy các trường nào).

Có ai biết vấn đề đó có thể gây ra không?

Tôi đang đặt mã ở đây từ Apple Documents để bạn có thể xem chính xác mã tôi đang sử dụng mà không phải nhấp vào.

//my .h 
    IBOutlet UIScrollView *scrollView; 
    IBOutlet UITextField *activeField; 

//.m 
    // Call this method somewhere in your view controller setup code. 
    - (void)registerForKeyboardNotifications 
    { 
     [[NSNotificationCenter defaultCenter] addObserver:self 
       selector:@selector(keyboardWasShown:) 
       name:UIKeyboardDidShowNotification object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(keyboardWillBeHidden:) 
      name:UIKeyboardWillHideNotification object:nil]; 

} 

// Called when the UIKeyboardDidShowNotification is sent. 
- (void)keyboardWasShown:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); 
    scrollView.contentInset = contentInsets; 
    scrollView.scrollIndicatorInsets = contentInsets; 

    // If active text field is hidden by keyboard, scroll it so it's visible 
    // Your application might not need or want this behavior. 
    CGRect aRect = self.view.frame; 
    aRect.size.height -= kbSize.height; 
    if (!CGRectContainsPoint(aRect, activeField.frame.origin)) { 
     CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height); 
     [scrollView setContentOffset:scrollPoint animated:YES]; 
    } 
} 

// Called when the UIKeyboardWillHideNotification is sent 
- (void)keyboardWillBeHidden:(NSNotification*)aNotification 
{ 
    UIEdgeInsets contentInsets = UIEdgeInsetsZero; 
    scrollView.contentInset = contentInsets; 
    scrollView.scrollIndicatorInsets = contentInsets; 
} 
- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    activeField = textField; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    activeField = nil; 
} 
+0

tôi chỉnh sửa copy-paste của mã của Apple ra khỏi bài viết của bạn vì nó là nghi ngờ rằng SO có sự cho phép của Apple để tái tạo nó. Tôi cũng đã gắn cờ cho một người kiểm duyệt để xem xét - Tôi không chắc chắn chính sách chính thức là gì hoặc nên như thế nào. –

+0

@Josh: Lượng nhỏ mã đó có thể là OK, cho mục đích ["Sử dụng hợp pháp",] (http://en.wikipedia.org/wiki/Fair_use). –

+0

@Robert: Ok, cảm ơn. James, tôi đoán điều đó có nghĩa là bạn nên đưa nó trở lại nếu bạn chọn. Xin lỗi vì phiền. –

Trả lời

33

CẬP NHẬT: Câu trả lời dưới đây là lỗi thời. Bây giờ bạn có thể sử dụng thư viện "TPkeyboardavoiding" để xử lý tất cả các loại hoạt động trường văn bản trong UIScrollView, UITableView & nhiều hơn nữa. Hãy thử nó và cho tôi biết nếu có ai gặp vấn đề trong tích hợp.

Old trả lời

Không cần đăng ký thông báo bàn phím cho chức năng này. Để tập trung các TextField hoạt động màn hình phía trên bàn phím, bạn chỉ cần thiết lập các contentOffset của UIScrollView hai phương pháp như ở đây:

// called when textField start editting. 
- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    activeField = textField; 
    [scrollView setContentOffset:CGPointMake(0,textField.center.y-60) animated:YES]; 
} 



// called when click on the retun button. 
- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 


    NSInteger nextTag = textField.tag + 1; 
    // Try to find next responder 
    UIResponder *nextResponder = [textField.superview viewWithTag:nextTag]; 

    if (nextResponder) { 
     [scrollview setContentOffset:CGPointMake(0,textField.center.y-60) animated:YES]; 
     // Found next responder, so set it. 
     [nextResponder becomeFirstResponder]; 
    } else { 
     [scrollview setContentOffset:CGPointMake(0,0) animated:YES]; 
     [textField resignFirstResponder]; 
     return YES; 
    } 

    return NO; 
} 

Lưu ý: Tất cả TextField nên có thẻ gia tăng Giống như 1,2, 3 và không. Và thiết lập các đại biểu để tự.

Cảm ơn,

+5

Nếu trường văn bản không chứa trực tiếp trong chế độ xem cuộn, 'center.y' sẽ là vị trí sai. Vì vậy, người ta nên sử dụng một cái gì đó như thế này thay vì tính toán vị trí chính xác: '_scrollView.contentOffset = CGPointMake (0, [_scrollView convertPoint: CGPointZero fromView: textField] .y - 60);' – AndiDog

+0

giá trị -60 là gì? –

+0

-60 là giá trị bù trừ sẽ thay đổi tùy theo chế độ xem và kích thước bàn phím của bạn. Trong trường hợp của tôi, giá trị đó phù hợp nhất với tôi. – MinuMaster

0

Sau khi thực hiện chắc chắn các đại biểu đã được thiết lập, tôi đã đi qua mã và rút ra tất cả các tọa độ của tất cả mọi thứ và đã làm tất cả các môn toán và phải tự đặt một số biến, nhưng bây giờ nó hoạt động như dự định.

Nếu ai đó cần trợ giúp với nó trong tương lai, tôi sẽ rất vui khi được trợ giúp. Twitter của tôi nằm trong tiểu sử của tôi.

+0

Xin chào James, tôi đã gặp một vấn đề cũng như theo Tài liệu của Apple. Vấn đề của tôi là khi tôi chạm vào trường văn bản, không có gì xảy ra. Thanh cuộn sẽ không hiển thị và không thể cuộn được. Bạn có thể cho tôi mượn một tay không? Cảm ơn trước. – dumbfingers

+0

Xin lỗi vì phản hồi chậm. Đã bận rộn tại nơi làm việc. Bạn có một số mã tôi có thể xem? Nếu bạn đang sử dụng IB, hãy chắc chắn rằng tất cả các cửa hàng của bạn được nối. – Baub

+0

Hey James, cảm ơn bạn đã trả lời, tôi đã tự giải quyết vấn đề này chỉ vài giờ sau khi tôi hỏi bạn. dù sao cũng cảm ơn bạn!!! – dumbfingers

6

Kể từ khi tôi tìm thấy nó, tôi sử dụng TPKeyboardAvoiding

Nó đang làm việc tuyệt vời, và rất dễ dàng để thiết lập:

  1. Thêm một UIScrollView vào xib điều khiển xem của bạn
  2. Đặt xem di chuyển của lớp đến TPKeyboardAvoidingScrollView (vẫn còn trong xib, thông qua thanh tra danh tính)
  3. Đặt tất cả các điều khiển của bạn vào trong scrollview đó

Nó cũng tự động móc lên nút "Tiếp theo" trên bàn phím để chuyển qua các trường văn bản.

Chúc may mắn!

1

Cách tiếp cận của Minumaster hoạt động tốt nhưng tôi muốn đề xuất một cách đơn giản nhưng tổng quát hơn giống như quả táo bằng cách xem xét chiều cao của bàn phím, điều này rất hữu ích khi chúng tôi sử dụng thanh công cụ tùy chỉnh trên đầu bàn phím. mặc dù phương pháp tiếp cận của apple here có rất ít vấn đề.

Đây là cách tiếp cận của tôi (Hơi sửa đổi cách táo) -

// Called when the UIKeyboardDidShowNotification is sent. 
- (void)keyboardWasShown:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); 
    self.scrollView.contentInset = contentInsets; 
    self.scrollView.scrollIndicatorInsets = contentInsets; 
} 

// Called when the UIKeyboardWillHideNotification is sent 
- (void)keyboardWillBeHidden:(NSNotification*)aNotification 
{ 
    UIEdgeInsets contentInsets = UIEdgeInsetsZero; 
    self.scrollView.contentInset = contentInsets; 
    self.scrollView.scrollIndicatorInsets = contentInsets; 
} 
Các vấn đề liên quan