2012-01-17 50 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); 
    }]; 
}