在我的视图控制器中,我将 a 设置titleView
为 a UIView
,其中包含 aUIImageView
在其层上使用 setCornerRadius 制成的圆形。
圆圈的上半部分位于导航栏上方,下半部分位于视图上方,如下所示:
现在,当我推动这个视图控制器时,当它动画化时,圆的下半部分被切断,直到动画完成。仅显示导航栏中的部分,如下所示:
推送动画一结束,就会显示完整的圆圈。titleView
有什么办法可以阻止导航栏在动画发生时屏蔽/切断,以便在动画期间显示整个圆圈?
在我的视图控制器中,我将 a 设置titleView
为 a UIView
,其中包含 aUIImageView
在其层上使用 setCornerRadius 制成的圆形。
圆圈的上半部分位于导航栏上方,下半部分位于视图上方,如下所示:
现在,当我推动这个视图控制器时,当它动画化时,圆的下半部分被切断,直到动画完成。仅显示导航栏中的部分,如下所示:
推送动画一结束,就会显示完整的圆圈。titleView
有什么办法可以阻止导航栏在动画发生时屏蔽/切断,以便在动画期间显示整个圆圈?
我不确定你是否应该这样做。
无论如何:将圆圈添加到您的 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;
}
}
最后,一旦您的视图控制器消失,就从您的关键窗口中删除圆圈(请注意,这并不一定意味着您的视图控制器已弹出,您始终可以在 中再次将圆圈视图读取到关键窗口viewWillAppear:
)。
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
/* Remove the circle from your key window. */
[_circle removeFromSuperview];
}