iphone - 使用动画 block 移动原点调整 UIScrollView 的大小

标签 iphone objective-c ios

如果键盘将隐藏 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/

相关文章:

ios - 更新 View Controller 中的 UIBarButtonItem

iphone - 自动构建 iPhone 应用程序需要哪些步骤?

iphone - 使用 RxSwift 返回 DispatchGroup 之后的对象

iphone - Xcode 4.2 首选项 "Support Wirelessly Connected Devices"有什么作用?

objective-c - 带有随机文本/值或标签的 UIButton

android - 收到推送通知后打开应用程序

iphone - 将FirstResponder 重新分配给不再出现在屏幕上的UITableViewCell 上的UITextView

javascript - jQuery Mobile slider 根据其值触发不同的事件

iphone - 在 linkedin 上发布数据时出错?

objective-c - 首次启动应用程序时 iCloud 不工作