Xcode 5.1 ve iOS 7.1'e yükselttikten sonra geçiş geçişi sırasında gezinme çubuğunda koyu gölge


92

Bir ana ayrıntılı gezinme denetleyicisinde üst ve alt denetleyiciler arasında ileri ve geri giderken, üstte gezinme çubuğunun sağ tarafında koyu bir gölge görüyorum. Xcode 5.1'e yükselttikten sonra başladı. Sert ve rahatsız edici geliyor. Ondan nasıl kurtulabilirim?

Yanıtlar:


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

Gezinme denetleyicisinin görünümünün arka plan rengini ayarlayarak bu sorunu çözdüm.


Bu cevap aslında çok iyi. Bazı nedenlerden dolayı, Arayüz Oluşturucu, gezinme denetleyicinizin görünümüne erişmenize izin vermiyor, ancak bir darkColorgörünüm hala orada ve bu soruna neden oluyor gibi görünüyor .
superarts.org

1
Bu harika bir cevap çünkü aynı zamanda, gezinme denetleyicisinden akan çirkin siyah bölümü göstermezken çubuğun yarı saydam kalmasına da izin veriyor. Film şeridinde kurmanın bir yolu olsaydı.
dimiguel

Kesinlikle. Zaman zaman bunun hakkında düşünüyorum ve gezinme çubuğu şeffaflığını kapatmayı öneren diğer yanıtlar hakkında biraz hayal kırıklığına uğradım, çünkü temelde bu sorunu bir özelliği devre dışı bırakarak çözüyorlar, bu yanıt gerçek düzeltmeye işaret ediyor. Bu davranışın Xcode 7 / iOS 9'da aynı kalması çok kötü.
superarts.org

1
Üzgünüm, bu yanıta oy vermedim çünkü pencere arka planı bu sorunun temel nedeni değil. Lütfen ekli ekran görüntüsüne bakın: imgur.com/a/SH5Dp Sorunun hala var olduğunu göreceksiniz, koyu gölgenin yeni beyaz olanla değiştirildiğini, sanırım ayrıntılar denetleyicisinin 'kırpıldığını' veya bir şekilde NavBar'ın altına hiçbir şey çizmemesini sağlayın .
mariotaku

1
tabBarController? .view.backgroundColor = UIColor.white, kök denetleyici UITabBarController ise.
Vishal Singh

55
self.navigationController.navigationBar.translucent = NO; 

Daha Yeni Swift Sürümleri için:

navigationController?.navigationBar.isTranslucent = false

Bunu nereye yerleştirdin?
Zorayr

Ana görünüm denetleyicisinin ViewDidLoad yönteminde
Nihat

Görünüm ekleDidAppear
Abdul Waheed

bence bu aslında doğru cevap. navigationController.view.backgroundColor = .whiteiOS 11. artık çalışmıyor
AnBisw

1
@Annjawn, navigationController.view.backgroundColor = .whiteiOS 12'de çalışıyor. Gezinme çubuğundan yarı saydamın kaldırılması gerektiğinde kullanılamaz, ancak siyah gölge kullanılmaz.
Alex Motor

38

nonamelive'ın cevabı mükemmel. Arayüz Oluşturucu'da aynı şeyi elde etmek VE HALA ÇEVRİMİ TUTMAK için, gezinme denetleyicisini seçin view.backgroundColorve ekran görüntüsünde (Identity Inspector'da) gösterildiği gibi kullanıcı tanımlı bir çalışma süresi niteliği ayarlayın . Bu sorunu gösteren tüm gezinme denetleyicileri için tekrarlayın.

Görünüşe göre tüm bu sorun, UINavigationController'ın siyah renginin (veya aslında renksiz), CoreGraphics'in animasyon başladığında anlık görüntülerini aldığı anda sızması nedeniyle ortaya çıkıyor. Yani beyaza ayarlamak bunu engelleyecektir.

Identity Inspector -> Kullanıcı Tanımlı Çalışma Zamanı Özellikleri


1
Bu yaklaşımı tercih ediyorum, mümkün olduğunca Interface Builder UI şeyler yapalım.
DazChong

iOS 8.4 yardımcı olmadı
Maksim Kniazev

3
Xcode 8.3.3 ile mükemmel çalışır. Sadece yeniden vurgulamak UINavigationControlleriçin, viewController'da değil, üzerinde ayarlanmalıdır.
jungledev

Bir sekmede bir navcon vardı ve navcon'un VC'lerinden birinde "Basıldığında alt çubuğu gizler" seçeneğini kullanırken her iki çubukta da (üst ve alt) gölgeler gördüm. Navcon'da beyaz arka plan ayarlamak her iki gölgeyi de sabitledi. Teşekkürler!
nh32rg

6

Bu, iOS 7.1'de tanıtılan bir hata gibi görünüyor. Benim durumumda bu, doğrudan gezinme çubuğunun altına yerleştirilmiş bir UIToolbar'dan kaynaklanıyor. Koyu gölge, yarı saydam sekme çubuğunda da görünür.

Gölge, UIToolbar'ın arka plan görünümünden kaynaklanıyor gibi görünüyor. Şimdi bu geçici çözümü, geçiş sırasında araç çubuğunun arka plan görünümünü gizleyen araç çubuğuyla birlikte görünüm denetleyicisinde kullanıyorum:

- (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;
    }
}

Bu koddur [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

Bu Radarı dosyaladım: http://openradar.appspot.com/16418845


2
Yarı saydam bir gezinme çubuğu istemiyorsanız çözümünüz gayet iyi.
tom

Elde etmenin daha kolay bir yolu var backgroundView. [self.toolbar valueForKey:@"_backgroundView"]. Lütfen bunun özel bir API olduğunu unutmayın, ancak Apple tarafından yakalanmayacağınızı düşünüyorum çünkü _backgroundViewyalnızca genel bir isim.
nonamelive

Bu cevap, yapmam gereken şey konusunda bana ipucu verdi. Benim durumumda, arayüz oluşturucudaki UIToolbar'daki yarı saydam seçeneğin işaretini kaldırmak kadar basitti.
Greg W

4

Yarı saydam olan herhangi bir çubukta (TabBar veya ToolBar) gerçekleşiyor gibi görünüyor.
Yani düzeltmenin bir yolu _tabBar.translucent = NO;(benim durumumda) ayarlamaktır. Bu, gezinme çubuğunu yarı saydam bırakırken üst gezinme çubuğunun altındaki istenmeyen gölgeyi önler. Maalesef alt çubuk artık yarı saydam değil.

Yarı saydamlığa geri döndürülebilir, ancak tüm bunların tüm itme animasyonu bittikten sonra gerçekleşmesi gerekir, bu nedenle bu özelliğin değiştirilmesi oldukça fark edilir.

Bununla birlikte, alt çubuğun da yarı saydam olması gerekir ve kullanıcının aşağıdaki sorunu çözdüğüm değişikliği görmesini istemiyorum:

/*  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];
                 }];

Sonra viewDidAppear:bunu basitçe geri döndürüyorum:

[UIView animateWithDuration:0.1
             animations:^{
                     _tabBar.barTintColor = nil;
                     _tabBar.translucent = YES;
                 }];

Özellikle görünümde küçük bir değişiklik var, ancak neredeyse hiç fark edilmiyor ve gezinme çubuğunun altındaki gölgeye sahip olmaktan çok daha iyi.

Umarım, Apple bu davranışı düzeltene kadar, diğer yayınlarda özellikle diğer yayınlarda önerildiğinden farklı olarak, bazı durumlarda UITabBar


@ Manmal çözümünü benimseyerek bu sorunu çözebildim view.backgroundColor— film şeridinde UITabBarController'ınız için çalışma zamanı özniteliğini tanımlayın ve onu beyaz renge ayarlayın.
jamesk

4

Bu benim için Swift'de çalışıyor

Gelen AppDelegateüzerinde didFinishLaunchingWithOptionsyöntemle, bu ayarlayın:

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

4

Benim için bu eserler iOS 13 hem ışık ve karanlık temalar ve ayrıca eski iOS sürümlerinde.

Metoda AppDelegate'e aşağıdaki kodu ekleyin application(didFinishLaunchingWithOptions):

if #available(iOS 13.0, *) {
    window?.backgroundColor = UIColor.systemBackground
} else {
    window?.backgroundColor = UIColor.white
}

Ben de bu yöntemi denedim, ancak varsayılan modda bir görünüm denetleyicisi sunarken bir sorunla karşılaşıyorum. Ardından siyah yerine beyaz arka plan penceresini göreceksiniz. Tuhaf görünüyor. lütfen bu durumun üstesinden gelmek için herhangi bir fikir önerebilir misiniz
varun v nair

3

İşte benim varyasyonum ... Tom'un cevabından çok daha az kod gerektiriyor ve daha verimli. Bu, yarı saydam bir gezinme çubuğu istiyorsanız ve bu gölge sorununu da düzeltmek istiyorsanız EĞER.

ViewController kaynağında (Gezinti Denetleyicisine gömülüdür) ...

- (void)viewDidAppear:(BOOL)animated
{
     self.navigationController.navigationBar.translucent = YES;
}

ve

 - (void)viewWillDisappear:(BOOL)animated
 {
     self.navigationController.navigationBar.translucent = NO;
 }

Sonuç, Tom'un yaptığı şeyle aynıdır (görsel olarak, son kullanıcıya) ve uygulaması daha kolaydır. Bu yardımcı olur umarım...


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

Bu benim için çalışıyor, onu yeni ViewController'ı ittiğiniz fonksiyonun içine yerleştirin.


Çılgınca, ama tüm cevaplar arasında, onu işleve yerleştirme fikri bir sonraki VC'ye iten fikirdi!
Coltuxumab

3

Aşağıdakiler de çalışır ve Gezinme Çubuğunu şeffaf bırakır:

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


1

Hisse senedi iOS uygulamasıyla aynı olmasa da, bu sorunu çözmenin güzel bir yoludur:

- (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;
    }];
}

Sekme çubuğunda hoş bir solma / solma animasyonu alacaksınız. Kodu köke ekleyin UIViewController.


-1

Ya da arabirim oluşturucuyu kullanıyorsanız, bu garip etkiden kurtulmak için gezinme denetleyicinizden Gezinme Çubuğu'nu seçebilir ve Özellik Denetçisi'nde Stil ve Çubuk Tonu arasındaki Yarı Saydam onay kutusunun işaretini kaldırabilirsiniz -

Müfettiş

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.