Answers:
self.navigationController.view.backgroundColor = [UIColor whiteColor];
我通过设置导航控制器视图的背景色解决了这个问题。
self.navigationController.navigationBar.translucent = NO;
解决它
navigationController.view.backgroundColor = .white
没有了在iOS 11.工作
navigationController.view.backgroundColor = .white
可在iOS 12上使用。在需要导航的情况下,不能使用从导航栏中删除半透明的按钮,但是不需要黑色阴影。
nonamelive的答案是完美的。要在Interface Builder中实现相同目的并保持TRANSLUCENCY,请选择导航控制器并设置用户定义的运行时属性view.backgroundColor
,如屏幕快照(在Identity Inspector中)所示。对所有显示此问题的导航控制器重复上述步骤。
似乎出现了整个问题,因为在动画开始CoreGraphics快照时,UINavigationController的黑色(或实际上没有颜色)正在泄漏。因此,将其设置为白色可以防止这种情况。
UINavigationController
,而不是在viewController上。
这似乎是iOS 7.1中引入的错误。就我而言,这是由直接位于导航栏下方的UIToolbar引起的。暗阴影也出现在半透明的标签栏中。
阴影似乎是由UIToolbar的背景视图引起的。我现在在视图控制器和工具栏中使用此解决方法,该工具栏在过渡期间隐藏工具栏的背景视图:
- (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
我提交了此雷达:http : //openradar.appspot.com/16418845
backgroundView
。[self.toolbar valueForKey:@"_backgroundView"]
。请注意,这是一个私有API,但是我认为您不会被Apple所吸引,因为_backgroundView
它只是一个通用名称。
半透明的任何条(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;
}];
特别是外观上只有一点变化,但是几乎没有引起注意,而且比在导航栏下放置阴影要好得多。
希望它能帮助其他人保持透明状态,直到Apple解决此问题为止,因为在某些情况下,不希望将其隐藏,这与其他帖子中特别建议的不一样。 UITabBar
view.backgroundColor
在情节提要中为UITabBarController 定义运行时属性,并将其设置为白色。
这适用于具有亮色和深色主题的iOS 13以及较旧的iOS版本。
将以下代码添加到AppDelegate的application(didFinishLaunchingWithOptions)
方法中:
if #available(iOS 13.0, *) {
window?.backgroundColor = UIColor.systemBackground
} else {
window?.backgroundColor = UIColor.white
}
这是我的变化形式……它所需的代码比汤姆的答案少得多,并且效率更高。如果您想要一个半透明的导航栏,并且还想解决该阴影问题。
在源ViewController中(嵌入在Navigation Controller中)...
- (void)viewDidAppear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = YES;
}
和
- (void)viewWillDisappear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = NO;
}
结果与Tom所做的相同(在视觉上,对于最终用户),并且更易于实现。希望这可以帮助...
self.navigationController!.navigationBar.translucent = false;
这对我有用,将其放入您推送新ViewController的函数中
虽然它与普通的iOS实现不同,但这是解决此问题的好方法:
- (void)viewWillAppear:(BOOL)animated {
[UIView animateWithDuration:0.35f animations:^{
self.tabBarController.tabBar.alpha = 1.0f;
}];
}
- (void)viewWillDisappear:(BOOL)animated {
[UIView animateWithDuration:0.35f animations:^{
self.tabBarController.tabBar.alpha = 0.0f;
}];
}
您将获得选项卡栏的漂亮的淡入/淡出动画。在根目录中添加代码UIViewController
。
darkColor
视图仍然存在并导致此问题。