Bayangan gelap pada bilah navigasi selama transisi segue setelah meningkatkan ke Xcode 5.1 dan iOS 7.1


92

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?

Jawaban:


144
self.navigationController.view.backgroundColor = [UIColor whiteColor];

Saya memecahkan masalah ini dengan mengatur warna latar belakang tampilan pengontrol navigasi.


Jawaban ini sebenarnya sangat bagus. Untuk beberapa alasan, Interface Builder tidak mengizinkan Anda mengakses tampilan pengontrol navigasi Anda, tetapi sepertinya darkColortampilan tersebut masih ada dan menyebabkan masalah ini.
superarts.org

1
Ini adalah jawaban yang bagus karena ini juga memungkinkan bilah tetap tembus cahaya sementara tidak menampilkan bagian hitam jelek yang keluar dari pengontrol navigasi. Hanya berharap ada cara untuk memasangnya di papan cerita.
dimiguel

Persis. Dari waktu ke waktu saya memikirkannya dan sedikit kecewa dengan jawaban lain yang menyarankan mematikan transparansi bilah navigasi, karena pada dasarnya mereka menyelesaikan masalah ini dengan menonaktifkan fitur, yang jawaban ini menunjukkan perbaikan yang sebenarnya. Sayang sekali perilaku ini tetap sama di Xcode 7 / iOS 9.
superarts.org

1
Maaf, saya tidak menyukai jawaban ini karena latar belakang jendela bukanlah penyebab utama masalah ini. Silakan lihat tangkapan layar saya terlampir: imgur.com/a/SH5Dp Anda akan menemukan masalahnya masih ada, bayangan gelap baru saja diganti menjadi putih, saya kira detail pengontrol mendapat 'terpotong' atau entah bagaimana, membuatnya tidak menggambar apa pun di bawah NavBar .
mariotaku

1
tabBarController? .view.backgroundColor = UIColor.white terjadi jika pengontrol root adalah UITabBarController.
Vishal Singh

55
self.navigationController.navigationBar.translucent = NO; 

Untuk Versi Swift yang Lebih Baru:

navigationController?.navigationBar.isTranslucent = false

Di mana Anda menempatkan ini?
Zorayr

Dalam metode ViewDidLoad dari master view controller
Nihat

tambahkan viewDidAppear
Abdul Waheed

Saya pikir ini sebenarnya jawaban yang benar. yang navigationController.view.backgroundColor = .whitetidak berfungsi lagi di iOS 11.
AnBisw

1
@Annjawn, navigationController.view.backgroundColor = .whiteberfungsi di iOS 12. Menghapus tembus cahaya dari bilah navigasi tidak dapat digunakan dalam situasi saat diperlukan, tetapi bayangan hitam tidak.
Alex Motor

38

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.backgroundColorseperti 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.

Identity Inspector -> User Defined Runtime Attributes


1
Saya lebih suka pendekatan ini, biarkan Interface Builder UI melakukan hal-hal sebanyak mungkin.
DazChong

iOS 8.4 tidak membantu
Maksim Kniazev

3
Bekerja sempurna dengan Xcode 8.3.3. Sekadar menekankan kembali, harus disetel ke aktif UINavigationController, bukan di viewController.
jungledev

Saya memiliki navcon di tabcon dan melihat bayangan di kedua bilah (atas dan bawah) saat menggunakan "Sembunyikan bilah bawah saat ditekan" di salah satu VC navcon. Mengatur latar belakang putih pada navcon memperbaiki kedua bayangan. Terima kasih!
nh32rg

6

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


2
Solusi Anda baik-baik saja jika Anda tidak ingin bilah navigasi tembus pandang.
tom

Ada cara yang lebih mudah untuk mendapatkan file backgroundView. [self.toolbar valueForKey:@"_backgroundView"]. Harap dicatat ini adalah API pribadi, tapi saya rasa Anda tidak akan tertangkap oleh Apple karena _backgroundViewhanya nama yang umum.
nonamelive

Jawaban ini memberi tahu saya apa yang perlu saya lakukan. Dalam kasus saya, itu sesederhana menghapus centang opsi tembus di UIToolbar di pembuat antarmuka.
Greg W

4

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


Saya dapat memperbaiki masalah ini dengan mengadopsi solusi @ manmal — tentukan atribut runtime view.backgroundColoruntuk UITabBarController Anda di storyboard, dan setel ke warna putih.
jamesk

4

Ini bekerja untuk saya di Swift

Dalam AppDelegatepada didFinishLaunchingWithOptionsmetode, saya set ini:

UIApplication.shared.windows.first?.backgroundColor = .white

4

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
}

Saya juga mencoba metode ini, tetapi saya menghadapi masalah saat menampilkan pengontrol tampilan dalam mode default. Kemudian Anda akan melihat latar belakang jendela berwarna putih, bukan hitam. Itu terlihat aneh. dapatkah Anda menyarankan ide untuk mengatasi situasi ini
varun v nair

3

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...


3
self.navigationController!.navigationBar.translucent = false;

Ini berfungsi untuk saya, tempatkan di dalam fungsi tempat Anda mendorong ViewController baru


Gila, tapi di antara semua jawaban, ide menempatkannya dalam fungsi mendorong ke VC berikutnya adalah satu-satunya!
Coltuxumab

3

Yang berikut ini juga berfungsi dan membiarkan Bilah Navigasi transparan:

[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor whiteColor];


1

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.


-1

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 -

Inspektur

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.