2012-01-17 29 views
5

Tôi đang trong quá trình cuộn UIScrollView lên nếu bàn phím sẽ ẩn UITextField. tôi giảm chiều cao của UIScrollView nếu nó sẽ được bao phủ mà hoạt động tốt. nhưng khi tôi cố gắng để tăng chiều cao của UIScrollView (trở lại kích thước ban đầu), toàn bộ UIScrollView di chuyển lên và sau đó animates xuống kích thước ban đầu và vị trí. nguồn gốc di chuyển lên theo số lượng X và di chuyển xuống vị trí cần thay vì chiều cao của chế độ xem mở rộng xuống.thay đổi kích thước một UIScrollView với chuyển động khối Hoạt ảnh gốc

- (void)keyboardWillShow:(NSNotification *)n 
{ 
    keyboardMove = self.rightScrollView.frame; 
    offsetMove = self.rightScrollView.contentOffset; 

    NSDictionary* userInfo = [n userInfo]; 

    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    [UIView animateWithDuration:.25 
          delay:0 
         options:(UIViewAnimationOptionAllowUserInteraction) 
        animations:^ 
        { 
         self.rightScrollView.frame = CGRectMake(self.rightScrollView.frame.origin.x, self.rightScrollView.frame.origin.y, self.rightScrollView.frame.size.width, (self.view.frame.size.height - (self.rightScrollView.frame.origin.y + keyboardSize.height))); 
        } 
        completion:nil]; 

    if ((activeTextField.frame.origin.y + activeTextField.frame.size.height) > self.rightScrollView.frame.size.height) 
    {   
     float contentOffsetMove = (self.rightScrollView.contentOffset.y + (activeTextField.frame.origin.y - self.rightScrollView.frame.size.height) + activeTextField.frame.size.height + 10); 

     self.rightScrollView.contentOffset = CGPointMake(self.rightScrollView.contentOffset.x, contentOffsetMove); 
    } 
} 

- (void)keyboardWillHide:(NSNotification *)n 
{ 
    if ((activeTextField.frame.origin.y + activeTextField.frame.size.height) > self.rightScrollView.frame.size.height) 
    { 
     [UIView animateWithDuration:.25 
           delay:0 
          options:(UIViewAnimationOptionAllowUserInteraction) 
         animations:^{ 
          [self.rightScrollView setContentOffset:offsetMove animated:YES]; 

          self.rightScrollView.frame = keyboardMove; 
         } 
         completion:nil]; 

    } 
    else 
    { 
     [UIView animateWithDuration:.25 
           delay:0 
          options:(UIViewAnimationOptionAllowUserInteraction) 
         animations:^{ 
          self.rightScrollView.frame = keyboardMove; 
         } 
         completion:nil]; 
    } 
} 

vì vậy, khi ẩn bàn phím, self.rightScrollView.origin di chuyển lên điểm X rồi làm động đến vị trí. tôi cần nguồn gốc để ở lại và chiều cao trở nên nhiều hơn (mọc xuống dưới).

bất kỳ ý tưởng nào về lý do hành động ngốc nghếch của nó?

+0

bạn đã quản lý để khắc phục vấn đề này? Tôi có chính xác cùng một vấn đề và không thể tìm thấy một giải pháp cho nó? – pnizzle

Trả lời

2

Tôi tin rằng đây có thể là lỗi trong UIKit nhưng cách xung quanh việc này là làm việc với scrollView's contentInset thay vì điều chỉnh khung. Vì vậy:

Thay vì

self.rightScrollView.frame = CGRectMake(self.rightScrollView.frame.origin.x, 
             self.rightScrollView.frame.origin.y, 
             self.rightScrollView.frame.size.width, 
             (self.view.frame.size.height - (self.rightScrollView.frame.origin.y + keyboardSize.height))); 

làm

self.rightScrollView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0); 
+0

điều này không di chuyển chèn, nhưng không đạt được những gì tôi đang tìm kiếm. ngay bây giờ, tôi thu nhỏ khung hình của tôi, di chuyển contentOffset lên nếu orgin của hộp văn bản lớn hơn (tức là ở dưới khung) sau đó là nội dung của chế độ xem cuộn. đề xuất của bạn giữ khung scrollview giống nhau và chỉ di chuyển các chèn, để lại một số hộp văn bản ẩn đằng sau bàn phím. – Padin215

+0

Sau đó, đó là một vấn đề di chuyển, phải không? '- (void) scrollRectToVisible: (CGRect) hoạt hình: (BOOL);' có thể giúp. – Joony

0

Bạn thử đánh vần ra các hình ảnh động chính xác như bạn muốn nó xảy ra? I E. nếu bạn muốn chiều cao tăng lên, hãy làm điều đó. Thay vì

self.rightScrollView.frame = keyboardMove; 

bạn có thể làm

CGRect f = self.rightScrollView.frame; 
f.size.height += keyboardMove.size.height - f.size.height; 
self.rightScrollView.frame = f; 
+1

đã dùng thử, vẫn gặp sự cố tương tự. – Padin215

+0

Tôi đã suy nghĩ về điều này. Đây là một ý tưởng khác: nó chỉ xảy ra với một 'UIScrollView' tại sao bạn không thử thiết lập thuộc tính' scrollEnabled' thành 'NO' trước khi hoạt ảnh? – Mundi

+0

Vẫn gặp vấn đề này –

3

Tôi không biết nếu bạn vẫn quan tâm đến câu trả lời vì tôi thấy các hoạt động cuối cùng ở đây là một năm trước, nhưng hôm nay tôi tình cờ chính xác cùng một vấn đề trong iOS 6 và quyết định chia sẻ giải pháp của tôi với bất kỳ ai vẫn quan tâm.

Tôi nhận thấy độ lệch mà UIScrollView di chuyển lên bằng một nửa kích thước chiều cao của bàn phím, nhưng chỉ khi nội dung của UIScrollView được bù đắp. Vì vậy, workaround của tôi là di chuyển UIScrollView DOWN với số tiền chính xác ngay trước khi hoạt hình, nếu bù đắp nội dung của UIScrollView lớn hơn 0. Điều này hoạt động tốt trên cả iPhone 4 (3,5 "hiển thị) và iPhone 5 (4" hiển thị) cho bây giờ, nhưng tôi không biết điều gì sẽ xảy ra nếu Apple quyết định sửa lỗi này, trong trường hợp nó thực sự là một lỗi UIKit.

Dù sao, đây là mã của tôi vì lợi ích rõ ràng của:

- (void)keyboardWillHide:(NSNotification *)notification 
{ 
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    if (self.scrollView.contentOffset.y > 0) { 
     CGRect f = CGRectMake(0, keyboardSize.height/2, self.scrollView.frame.size.width, self.scrollView.frame.size.height); 
     self.scrollView.frame = f; 
    } 

    [UIView animateWithDuration:0.25 animations:^{ 
     self.scrollView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); 
    }]; 
} 
Các vấn đề liên quan