回答:
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 およびSTILL KEEP TRANSLUCENCYで同じことを実現するには、ナビゲーションコントローラーを選択view.backgroundColor
し、スクリーンショット(アイデンティティーインスペクター)に示すようにユーザー定義のランタイム属性を設定します。この問題を示すすべてのナビゲーションコントローラについて繰り返します。
この問題全体は、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であることに注意してください。ただし、これは_backgroundView
単なる一般的な名前であるため、Appleに引っかかることはないと思います。
半透明のバー(TabBarまたはToolBar)で発生するようです。
したがって、それを修正する1つの方法は、_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(ナビゲーションコントローラーに埋め込まれている)...
- (void)viewDidAppear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = YES;
}
そして
- (void)viewWillDisappear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = NO;
}
結果はトムが(視覚的にはエンドユーザーに対して)行うことと同じであり、実装が簡単です。お役に立てれば...
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
ビューがまだ存在しているように見え、この問題が発生します。