如何修复titleView在过渡期间被隐藏到导航栏?

Posted

技术标签:

【中文标题】如何修复titleView在过渡期间被隐藏到导航栏?【英文标题】:How to fix titleView being masked to navigation bar during transition? 【发布时间】:2013-11-12 20:16:06 【问题描述】:

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

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

现在,当我推动这个视图控制器时,当它动画化时,圆的下半部分被切断,直到动画完成。仅显示导航栏 in 的部分,如下所示:

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

【问题讨论】:

【参考方案1】:

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

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

- (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;
    

最后,一旦你的视图控制器消失,从你的关键窗口中删除圆圈(注意这并不一定意味着你的视图控制器被弹出,你总是可以在@中再次将圆圈视图读取到关键窗口987654327@).

- (void)viewDidDisappear:(BOOL)animated 
    [super viewDidDisappear:animated];

    /* Remove the circle from your key window. */
    [_circle removeFromSuperview];

【讨论】:

以上是关于如何修复titleView在过渡期间被隐藏到导航栏?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 8 上修复横向导航栏项目的高度?

viewController.titleView 全宽在过渡时闪烁

没有导航器导航栏没有显示titleView

自定义导航栏 titleView 在加载新标题之前不会清除以前的标题

让 NavigationBar 的 titleView 比自己大

导航栏和它的titleView rightBarButtonItem随着动画变得更小