如何修复在过渡期间被屏蔽到导航栏的titleView?

时间:2013-11-12 20:16:06

标签: ios objective-c animation uinavigationcontroller titleview

在我的视图控制器中,我将titleView设置为UIView,其中包含UIImageView,在其图层上使用setCornerRadius将其设为圆圈。

圆圈的上半部分位于导航栏上方,下半部分位于视图上方,如下所示:

A

现在当我按下这个视图控制器时,它会动画,圆圈的下半部分被切掉,直到动画完成。只显示导航栏中 部分,如下所示:

B

推动画结束后,会显示整个圆圈。有什么方法可以阻止导航栏在动画发生时屏蔽/切断titleView,以便在动画期间显示整个圆圈吗?

1 个答案:

答案 0 :(得分:1)

我不确定你是否应该这样做。

无论如何:将圆圈添加到UIWindow(在UINavigationController之上)。我想你想把圆圈放在屏幕的中心(水平)。您可以使用转换协调器(iOS 7.0 +)在视图控制器的转换(推或弹出)旁边为圆圈设置动画。请注意,此适用于动画过渡(即设置animated时)。因此,我们需要在未设置animated时手动设置新框架。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    /* Add the circle to the key window (instead of the navigation bar). */
    UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
    [keyWindow addSubview:_circle];

    /* Screen width: the initial position of the circle = center + screen width. */
    CGFloat width = self.view.bounds.size.width;

    CGRect destination = _circle.frame;
    destination.origin.x = 110.f;

    /* The transition coordinator is only available for animated transitions. */
    if (animated) {
        CGRect frame = destination;
        frame.origin.x += width;
        _circle.frame = frame;

        void (^animation)(id context) = ^(id context) {
            _circle.frame = destination;
        };

        [self.transitionCoordinator animateAlongsideTransitionInView:_circle
                                                           animation:animation
                                                          completion:animation];
    }else {
        _circle.frame = destination;
    }
}

110.f替换为您的职位(110.f = ((320.f - 100.f) / 2.f))。

现在,您还需要使用转换协调器为pop设置动画。

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    /* Screen width: the initial position of the circle = center + screen width. */
    CGFloat width = self.view.bounds.size.width;

    CGRect destination = _circle.frame;
    destination.origin.x = 110.f + width;

    /* The transition coordinator is only available for animated transitions. */
    if (animated) {
        CGRect frame = destination;
        frame.origin.x = 110.f;
        _circle.frame = frame;

        void (^animation)(id context) = ^(id context) {
            _circle.frame = destination;
        };

        [self.transitionCoordinator animateAlongsideTransitionInView:_circle
                                                           animation:animation
                                                          completion:animation];
    }else {
        _circle.frame = destination;
    }
}

最后,只要视图控制器消失,就从关键窗口中删除圆圈(请注意,这并不一定意味着您的视图控制器会弹出,并且您始终可以在{}中再次将圆形视图读取到关键窗口{1}})。

viewWillAppear: