如果键盘将隐藏 UITextField,我正在向上滚动 UIScrollView。我降低了 UIScrollView 的高度,如果它会被覆盖,效果很好。但是当我尝试增加 UIScrollView 的高度(恢复到原始大小)时,整个 UIScrollView 向上移动然后向下移动到原始大小和位置。原点向上移动 X 量并向下移动到它应该在的位置,而不是 View 的高度向下扩展。
- (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 点,然后动画到应该的位置。我需要原点保持不动并且高度变得更高(向下增长)。
知道为什么它的行为很愚蠢吗?
最佳答案
我不知道你是否仍然对答案感兴趣,因为我看到这里的最后一个事件是一年前,但今天我在 iOS 6 中偶然发现了完全相同的问题,并决定与仍然存在的任何人分享我的解决方案有兴趣。
我注意到 UIScrollView 向上移动的偏移量是键盘高度的一半,但前提是 UIScrollView 的内容发生偏移。所以我的解决方法是在动画之前将 UIScrollView 向下移动完全相同的量,如果 UIScrollView 的内容的偏移量大于 0。这在 iPhone 4(3.5"显示器)和 iPhone 5(4"显示器)上工作正常现在,但我不知道如果 Apple 决定修复这个问题会发生什么,以防它真的是一个 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);
}];
}
关于iphone - 使用动画 block 移动原点调整 UIScrollView 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8901753/