iOS 8.0.2:当UINavigationController包含在RootViewController中时,UIView框架动画无法正常工作

时间:2014-10-14 05:12:55

标签: objective-c animation uikit ios8

我创建了一个RootViewController / RootView:

  • 处理应用的内容布局
  • 用于执行应用程序级行为的曝光和界面,例如使用CAKeyframe动画呈现“汉堡包”菜单或叠加视图。

这符合良好做法。

问题:

当主内容视图显示表单时,有一个实用程序可以在选择一个字段时为该视图的框架设置动画,否则该字段会被键盘遮挡。这一直一直运行到iOS 8.0.2

  • 在iOS 8.0.2上,如果为origin.y设置负值,则表单的框架将不再生成动画。而不是从当前的origin.y转到所需的origin.y,它按照它应该移动的量猛然减少,然后动画回到0.
  • 如果我在RootVC之外提供表单,它可以正常工作。

我尝试了什么:

  • 检查RootView在布局子视图中没有执行任何操作以阻止动画。 (在iOS8.0中它是。我删除了这个,问题解决了。只在iOS8.0.2中返回)
  • 检查BeginFromCurrentState标志。
  • 取代动画表单视图,动画[UIScreen mainScreen].keyWindow。工作,但会导致一些我不想要的副作用。

问题:

iOS8.0.2中另一个视图中包含的UIViewControllers动画改变了什么。这似乎是非常基础的东西。

RootVC

动画框架将输入字段移出键盘的代码:

看起来像这样:

- (void)scrollToAccommodateField:(UIView *)view
{
    UIView *rootView = [UIApplication sharedApplication].keyWindow.rootViewController.view;
    CGPoint position = [view convertPoint:view.bounds.origin toView:rootView];

    CGFloat y = position.y;
    CGFloat scrollAmount = 0;
    CGFloat margin = 25;
    CGSize screenSize = [self screenSizeWithOrientation:[UIApplication sharedApplication].statusBarOrientation];
    CGSize accessorySize = CGSizeMake(_view.width, 44);

    CGFloat maxVisibleY = screenSize.height - [self keyboardSize].height - accessorySize.height - margin;

    if (y > maxVisibleY)
    {
        scrollAmount = maxVisibleY - y;
        CGFloat scrollDelta = scrollAmount - _currentScrollAmount;
        _currentScrollAmount = scrollAmount;
        [self scrollByAmount:scrollDelta];
    }
    else
    {
        if (_currentScrollAmount != 0)
        {
            _currentScrollAmount = 0;
            [UIView transitionWithView:_view duration:0.30
                options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseOut animations:^
                {
                    _view.frame = [_view bounds];
                } completion:nil];
        }
    }
}

更新

我已经安装了TPKeyboardAvoiding pod并且它的工作非常好。 。保持开放,以防其他人感兴趣。

0 个答案:

没有答案