如何修复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在过渡期间被隐藏到导航栏?的主要内容,如果未能解决你的问题,请参考以下文章
viewController.titleView 全宽在过渡时闪烁
自定义导航栏 titleView 在加载新标题之前不会清除以前的标题