使用动画块调整UIScrollView的大小移动原点
问题描述:
如果键盘将隐藏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点,然后动画的位置是应该的。我需要保持原点,高度变得更高(向下增长)。
任何想法为什么它的行为愚蠢?
答
我认为这可能是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);
答
你尝试准确拼写出动画你想要的发生?即如果你想要增加身高,那就做吧。取而代之的
self.rightScrollView.frame = keyboardMove;
你可以做
CGRect f = self.rightScrollView.frame;
f.size.height += keyboardMove.size.height - f.size.height;
self.rightScrollView.frame = f;
答
我不知道你是否仍然有兴趣在回答,因为我在这里看到的最后一项活动是一年前,但今天我偶然发现在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);
}];
}
你设法解决这个问题?我有完全相同的问题,找不到解决方案吗? – pnizzle 2012-09-25 03:25:15