Ketika saya menavigasi bolak-balik antara pengontrol orang tua dan anak di master - pengontrol navigasi detail, saya melihat bayangan gelap di sisi kanan bilah navigasi di bagian atas. Ini dimulai setelah saya meningkatkan ke Xcode 5.1. Rasanya kasar dan mengganggu. Bagaimana saya bisa menyingkirkannya?
92
darkColor
tampilan tersebut masih ada dan menyebabkan masalah ini.self.navigationController.navigationBar.translucent = NO;
Untuk Versi Swift yang Lebih Baru:
navigationController?.navigationBar.isTranslucent = false
sumber
navigationController.view.backgroundColor = .white
tidak berfungsi lagi di iOS 11.navigationController.view.backgroundColor = .white
berfungsi di iOS 12. Menghapus tembus cahaya dari bilah navigasi tidak dapat digunakan dalam situasi saat diperlukan, tetapi bayangan hitam tidak.jawaban nonamelive sempurna. Untuk mencapai hal yang sama dalam Pembuat Antarmuka DAN MASIH TERJEMAHAN , pilih pengontrol navigasi dan setel atribut runtime yang ditentukan pengguna
view.backgroundColor
seperti yang ditunjukkan pada tangkapan layar (di Inspektur Identitas). Ulangi untuk semua pengontrol navigasi yang menunjukkan masalah ini.Tampaknya seluruh masalah ini terjadi karena warna hitam (atau sebenarnya, tidak ada warna) dari UINavigationController bocor pada saat CoreGraphics memotretnya saat animasi dimulai. Jadi, mengaturnya menjadi putih akan mencegahnya.
sumber
UINavigationController
, bukan di viewController.Sepertinya ini adalah bug yang diperkenalkan di iOS 7.1. Dalam kasus saya, ini disebabkan oleh UIToolbar yang ditempatkan tepat di bawah bilah navigasi. Bayangan gelap juga muncul di bilah tab tembus pandang.
Bayangan tersebut tampaknya disebabkan oleh tampilan latar belakang UIToolbar. Sekarang saya menggunakan solusi ini di pengontrol tampilan dengan toolbar yang menyembunyikan tampilan latar belakang toolbar selama transisi:
- (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; } }
Ini adalah kode untuk
[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
Saya mengajukan Radar ini: http://openradar.appspot.com/16418845
sumber
backgroundView
.[self.toolbar valueForKey:@"_backgroundView"]
. Harap dicatat ini adalah API pribadi, tapi saya rasa Anda tidak akan tertangkap oleh Apple karena_backgroundView
hanya nama yang umum.Tampaknya ini terjadi dengan bilah apa pun (TabBar atau ToolBar) yang tembus cahaya.
Jadi salah satu cara untuk memperbaikinya adalah dengan mengatur
_tabBar.translucent = NO;
(dalam kasus saya). Ini mencegah bayangan yang tidak diinginkan di bawah bilah navigasi atas sementara bilah navigasi tetap tembus cahaya. Sayangnya bilah bawah tidak lagi tembus.Ini dapat diatur kembali ke tembus cahaya tetapi semua ini harus terjadi setelah seluruh animasi mendorong selesai sehingga peralihan properti ini terlihat jelas.
Dalam kasus, bagaimanapun bilah bawah juga harus tembus cahaya dan saya tidak ingin pengguna melihat perubahan yang saya selesaikan dengan yang berikut:
/* 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]; }];
Kemudian di
viewDidAppear:
saya hanya mengembalikan itu kembali:[UIView animateWithDuration:0.1 animations:^{ _tabBar.barTintColor = nil; _tabBar.translucent = YES; }];
Hanya ada sedikit perubahan pada tampilan terutama tetapi hampir tidak terlihat dan jauh lebih baik daripada memiliki bayangan di bawah bilah navigasi.
Semoga ini akan membantu orang lain untuk menjaga agar bilah tetap tembus cahaya sampai Apple memperbaiki perilaku ini karena bilah ADALAH dimaksudkan untuk disembunyikan dalam beberapa kasus tidak seperti yang disarankan di pos lain terutama untuk
UITabBar
sumber
view.backgroundColor
untuk UITabBarController Anda di storyboard, dan setel ke warna putih.Ini bekerja untuk saya di Swift
Dalam
AppDelegate
padadidFinishLaunchingWithOptions
metode, saya set ini:UIApplication.shared.windows.first?.backgroundColor = .white
sumber
Ini berfungsi untuk saya di iOS 13 dengan tema terang dan gelap dan juga pada versi iOS yang lebih lama.
Tambahkan kode berikut ke AppDelegate ke
application(didFinishLaunchingWithOptions)
metode:if #available(iOS 13.0, *) { window?.backgroundColor = UIColor.systemBackground } else { window?.backgroundColor = UIColor.white }
sumber
Ini variasi saya ... membutuhkan lebih sedikit kode daripada jawaban tom, dan lebih efisien. Ini JIKA Anda ingin bilah navigasi tembus cahaya, dan juga ingin memperbaiki masalah bayangan itu.
Dalam sumber ViewController (yang disematkan di Pengontrol Navigasi) ...
- (void)viewDidAppear:(BOOL)animated { self.navigationController.navigationBar.translucent = YES; }
dan
- (void)viewWillDisappear:(BOOL)animated { self.navigationController.navigationBar.translucent = NO; }
Hasilnya sama dengan apa yang dilakukan Tom (secara visual, kepada pengguna akhir), dan lebih mudah diimplementasikan. Semoga ini membantu...
sumber
self.navigationController!.navigationBar.translucent = false;
Ini berfungsi untuk saya, tempatkan di dalam fungsi tempat Anda mendorong ViewController baru
sumber
Yang berikut ini juga berfungsi dan membiarkan Bilah Navigasi transparan:
[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor whiteColor];
sumber
Meskipun tidak sama dengan implementasi iOS stok, ini adalah cara yang bagus untuk memperbaiki masalah:
- (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; }]; }
Anda akan mendapatkan animasi fade-in / fade-out yang bagus dari bilah tab. Tambahkan kode di root
UIViewController
.sumber
Atau jika Anda menggunakan pembuat antarmuka, Anda cukup memilih Navigation Bar dari pengontrol navigasi Anda dan hapus centang pada kotak centang Translucent antara Style dan Bar Tint di Attributes Inspector untuk menghilangkan efek aneh itu -
sumber