UINavigationBar'ın iOS 7'de görünümün üstünü kapatması nasıl engellenir?


99

Xcode 5'e güncelledikten sonra, uygulamamın tüm görünümlerindeki gezinme çubukları aşağı kaydı. İşte bazı ekran görüntüleri, birincisi görünümdeki her şeyi aşağı çekilirken, ikincisi ise dokunulmamış halde gösteriyor. Arama çubuğu, gezinme çubuğunun bulunduğu yerden başlamalıdır.

Tüm içerik Boştaki Tüm İçerik

Bunu nasıl düzeltebileceğimi bilen var mı?

düzenleme: bu öneriyi daha önce denedim:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

Ama çok garip sonuçlar veriyor.

Çözüm Girişimi

Bunun nedeni, bu görünüm denetleyicisinin altında gezinme çubuğunun şeffaflığından dolayı görünen bir "slayt menüye" sahip olmam olabilir.


İşte bu sorun için başka bir çözüm. stackoverflow.com/a/51491645/10148333
Afonso

Yanıtlar:


235

Set NO navigasyon çubuğunun saydam özelliğini :

self.navigationController.navigationBar.translucent = NO;

Bu, görünümün gezinme çubuğunun ve durum çubuğunun altında çerçevelenmesini düzeltir.

Gezinme çubuğunu göstermeniz ve gizlemeniz gerekiyorsa,

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

senin içinde viewDidLoadyöntemle.


1
Bunu altına yerleştirdim viewDidLoadancak hiçbir değişiklik yapmıyor.
Sam D20

13
görünümde yapmakDidLayoutSubviews funtions
Hindu

1
Bunu viewDidLayoutSubviews öğelerine eklemek hile yaptı. Yardımınız için minnettarım beyler!
Sam D20

Merhaba, Herhangi Bir Soru? yoksa iltifat mı?
Hindu

1
self.edgesForExtendedLayout = UIRectEdgeNone; yardım etti
luky

32

Gelen iOS 7varsayılan tarafından tüm Kontrolör saydam özellik değeri HAYIR saydam özelliğini ayarlayın, böylece EVET ise bu sorun için.

self.navController.navigationBar.translucent = NO;

2
"NavController" özelliği yoktur. Bunu kullanın: self.navigationController.navigationBar.translucent = HAYIR;
Gene Z. Ragan

uygulama temsilcisinde navigtionbarcontroller nesnesi oluşturuyorum ve navController adını veriyorum.
Sumit Mundra

21

Bu ekranın Görüntü Denetleyicisinin Öznitelik denetçisindeki "Kenarları genişlet" seçeneğini devre dışı bırakabilirsiniz (aşağıdaki resimde gösterildiği gibi):

görüntü açıklamasını buraya girin


12

Bu, iOS 8.1'de de hızlı çalışır

navigationController?.navigationBar.translucent = false

8

Yarı saydamlığı kendi üzerinde navigationBar, sonunda viewDidLoadveya içinde tutmak istiyorsanız viewWillAppearbu kod satırını ekleyin:

[self.view sendSubviewToBack:self.tableView]

Her nasılsa, scrollViewalt sınıfınız ( UITableView, UICollectionViewvb.) indexMevcut görünümünüzde 0'da ise subviews, ekleri otomatik olarak ayarlayacaktır navigationBar. Ve iOS7'den önceki sürümlerde kullanıcı arayüzünüzü de etkilememelidir.


DÜZENLE Eğer UITableViewprogramlı olarak başlatırsanız , en iyisi bunu kullanarak görünüme eklemektir.[self.view insertSubview:self.tableView atIndex:0];


Bu doğru cevap olmalı. Alt görünümü programlı olarak ekliyorsanız, ekledikten sonra arkaya [self.view insertSubview:self.tableView atIndex:0];göndermek yerine yapabilirsiniz .
smitt04

Doğru. Ancak denetleyicisini (programlı olarak arabirim oluşturucu) nasıl başlattığını bilmeden, bunun en iyi çözüm olduğunu varsayamayız. Cevabımı değiştirmeme rağmen.
jbouaziz

Bu işe yarıyor ancak bir hack gibi görünüyor. Bununla ilgili resmi belgelerde herhangi bir bildirim var mı?
John Tracid

4

Swift 4 :

ViewDidLoad yönteminde aşağıdaki kod satırını ayarlayın:

self.navigationController?.navigationBar.isTranslucent = false

3

Bu yöntemi, bu URL'de gösterildiği gibi görünüm denetleyicinize ekleyebilirsiniz :

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}

2

Diğer bir yaklaşım, self.automaticallyAdjustsScrollViewInsets = YES;görünüm denetleyicinizi ayarlamaktır . Bu, varsayılan olarak etkindir. Ama senin durumunda:

EGORefreshHeaderView kullandığınızı görüyorum. UITableView'ün contentInset'i ile oynar. Dolayısıyla, serbest bıraktığınızda, başlık önceki değeri geri yüklemek yerine üst eki sıfırlayacaktır.


-1

Görünümler üzerinde tam kontrole sahip olmak ve hatalı iOS ayarlamalarından kaçınmak istiyorsanız, UITableView alt sınıfını seçin ve - (void) içindeki ekleri (hem kaydırma hem de göstergeler) ayarlayın willMoveToWindow: (UIWindow *) newWindow. Benim için çalışıyor.


-4

Başka bir seçenek de Info.plist dosyanızı kaynak kodu modunda açmak ve aşağıdaki bilgileri girmektir:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarHidden</key>
<true/>

Bu yardımcı olur umarım.


1
Bunun manzarayı hiç etkileyeceğini sanmıyorum.
Enrico Susatyo
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.