2012-01-17 88 views
5

如果鍵盤將隱藏UITextField,我正在滾動UIScrollView的過程中。如果它會被掩蓋,我會減少UIScrollView的高度,這很好。但是當我試圖增長UIScrollView的高度(回到原始大小)時,整個UIScrollView向上移動然後動畫到原始大小和位置。原點向上移動X量並向下移動到應該在的位置,而不是向下擴展視圖的高度。使用動畫塊調整UIScrollView的大小移動原點

- (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]; 
    } 
} 

所以,當鍵盤隱藏,self.rightScrollView.origin向上移動X點,然後動畫的位置是應該的。我需要保持原點,高度變得更高(向下增長)。

任何想法爲什麼它的行爲愚蠢?

+0

你設法解決這個問題?我有完全相同的問題,找不到解決方案嗎? – pnizzle 2012-09-25 03:25:15

回答

2

我認爲這可能是UIKit中的一個bug,但解決方法是使用scrollView的contentInset而不是調整幀。所以:

而不是

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))); 

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

這確實移動了插入,但沒有達到我要找的。現在,我縮小框架,如果文本框的邊距更大(即低於框架),則移動contentOffset,然後滾動視圖的內容。你的建議保持scrollview的框架相同,只是移動插入,留下一些文本框隱藏在鍵盤後面。 – Padin215 2012-01-18 16:03:36

+0

然後這是一個滾動問題,不是嗎? ' - (void)scrollRectToVisible:(CGRect)animated:(BOOL);'可能有幫助。 – Joony 2012-04-13 14:46:23

0

你嘗試準確拼寫出動畫你想要的發生?即如果你想要增加身高,那就做吧。取而代之的

self.rightScrollView.frame = keyboardMove; 

你可以做

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

試過了,仍然有同樣的問題。 – Padin215 2012-01-18 16:04:09

+0

我一直在想這個。這是另一個想法:它只發生在'UIScrollView'爲什麼你不嘗試在動畫之前將'scrollEnabled'屬性設置爲'NO'? – Mundi 2012-01-19 07:12:46

+0

我自己仍然有這個問題 – 2013-06-15 16:30:36

3

我不知道你是否仍然有興趣在回答,因爲我在這裏看到的最後一項活動是一年前,但今天我偶然發現在iOS 6中完全相同的問題,並決定與仍然感興趣的任何人分享我的解決方案。

我注意到了其中的UIScrollView向上移動是鍵盤的高度的一半大小,但前提是UIScrollView的內容偏移的偏移。所以我的解決方法是如果UIScrollView的內容的偏移量大於0,則在動畫之前將UIScrollView向下移動相同的量。這適用於iPhone 4(3.5「顯示器)和iPhone 5(4」顯示器)現在,但我不知道如果蘋果決定解決這個問題會發生什麼,以防它真的是一個UIKit錯誤。

總之,這裏是我的代碼爲清楚起見:

- (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); 
    }]; 
}