当我在主-细节导航控制器的父子控制器之间来回导航时,我会看到导航栏顶部右侧有一个深色阴影。这是在我升级到Xcode 5.1后出现的。它感觉很粗糙,很分散注意力。我该如何摆脱它?
当我在主-细节导航控制器的父子控制器之间来回导航时,我会看到导航栏顶部右侧有一个深色阴影。这是在我升级到Xcode 5.1后出现的。它感觉很粗糙,很分散注意力。我该如何摆脱它?
self.navigationController.view.backgroundColor = [UIColor whiteColor];
我通过设置导航控制器视图的背景颜色来解决了这个问题。
self.navigationController.navigationBar.translucent = NO;
适用于较新的 Swift 版本:
navigationController?.navigationBar.isTranslucent = false
navigationController.view.backgroundColor = .white
在iOS 12上可行。移除导航栏的半透明效果可能在某些情况下不合适,但黑色阴影则可以使用。 - Alex MotorUINavigationController
上设置,而不是在viewController上。 - jungledev- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) {
BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]]
&& [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]);
if (isToolbarBackgroundView) {
*stop = YES;
}
return (! isToolbarBackgroundView);
}];
if (toolbarBackgroundView) {
// fade toolbar background view back in
[UIView animateWithDuration:0.1f animations:^{
toolbarBackgroundView.alpha = 1.0f;
}];
}
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) {
BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]]
&& [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]);
if (isToolbarBackgroundView) {
*stop = YES;
}
return (! isToolbarBackgroundView);
}];
if (toolbarBackgroundView) {
// hide toolbar background view
toolbarBackgroundView.alpha = 0.0f;
}
}
[UIView findViewRecursively:]
代码的内容。@interface UIView (FindSubview)
- (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse;
@end
@implementation UIView (FindSubview)
- (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse {
for (UIView* subview in self.subviews) {
BOOL stop = NO;
if (recurse(subview, &stop)) {
UIView* view = [subview findViewRecursively:recurse];
if (view) return view;
} else if (stop) {
return subview;
}
}
return nil;
}
@end
我提交了这个Radar:http://openradar.appspot.com/16418845
(意思是作者提交了一个关于it技术的问题反馈链接)backgroundView
。 [self.toolbar valueForKey:@"_backgroundView"]
。请注意,这是一个私有API,但我认为你不会被苹果抓到,因为 _backgroundView
只是一个通用名称。 - nonameliveUIApplication.shared.windows.first?.backgroundColor = .white
这对我来说在上都可以工作,并且支持浅色和深色主题,也适用于旧版iOS。
将以下代码添加到AppDelegate的application(didFinishLaunchingWithOptions)
方法中:
if #available(iOS 13.0, *) {
window?.backgroundColor = UIColor.systemBackground
} else {
window?.backgroundColor = UIColor.white
}
似乎任何半透明的工具栏(TabBar或ToolBar)都会出现这种情况。
因此,一种解决方法是设置_tabBar.translucent = NO;
(在我的情况下)。这可以防止顶部导航栏下的不必要阴影,同时保持导航栏半透明。不幸的是,底部工具栏不再是半透明的。
它可以重新设置为半透明,但所有这些都必须在整个推送动画完成后才能发生,因此切换此属性非常明显。
然而,如果底部工具栏也必须是半透明的,而我不希望用户看到这种变化,我使用以下方法进行解决:
/* create a simple quick animation of the bottom bar
just before pushing the new controller */
[UIView animateWithDuration:0.1
animations:^{
_tabBar.barTintColor = [UIColor colorWithWhite:0.97254901960784 alpha:1.0]; // this is the closest color for my case
_tabBar.translucent = NO;
} completion:^(BOOL finished) {
/* now when the animation that makes the bar not translucent
is finished we can push the new controller
the controller is instantiated before the animation code */
[self.navigationController pushViewController:controller animated:YES];
}];
viewDidAppear:
中,我只需将其恢复回来:[UIView animateWithDuration:0.1
animations:^{
_tabBar.barTintColor = nil;
_tabBar.translucent = YES;
}];
外观上只有一点点变化,但几乎不会被注意到,而且比导航栏下面有阴影要好得多。
希望这能帮助其他人在苹果修复此行为之前保持条形透明,因为在某些情况下,栏目确实应该被隐藏,尤其是对于UITabBar
。
view.backgroundColor
,并将其设置为白色。 - jameskself.navigationController!.navigationBar.translucent = false;
- (void)viewDidAppear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = YES;
}
并且
- (void)viewWillDisappear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = NO;
}
结果与Tom执行的操作相同(从视觉上,对终端用户而言),并且更容易实现。希望这可以帮到您...
darkColor
的视图,并导致了这个问题。 - superarts.org