Yeni iOS7 SDK ile görünümler üzerinde gezinme çubuğu görünür


113
CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

Önceki sürümlerde düzgün çalışıyor. Arama çubuğu statusbarve gezinme çubuğunun altında görünüyor. tableviewArama çubuğunun altında görünüyor

Ancak bunu çalıştırdığımda Xcode 5 sdk iOS 7, arama çubuğu görünmüyor (sanırım durum çubuğunun ve gezinme çubuğunun altına yerleştirildi) ve ayrıca gezinme çubuğu tablo görünümünün üzerinde görünüyor.

iOS 7Kararlı sürümle düzeltilecek mi?

Yoksa kodlamamın sorunu mu?

Yoksa y (y = statubar height + nav bar height)değerini ekleyerek mi ele almalıyız iOS 7?

Yakın zamanda uygulamalarımı iOS 7'de test etmek için Xcode 5 DP'yi indirdim. İlk fark ettiğim ve onayladığım şey, görünümümün sınırlarının her zaman durum çubuğu ve gezinme çubuğunu hesaba katacak şekilde yeniden boyutlandırılmaması oldu.

ViewDidLayoutSubviews'te, görünümün sınırlarını yazdırıyorum:

{{0, 0}, {320, 568}}

Bu, içeriğimin gezinme çubuğunun ve durum çubuğunun altında görünmesine neden oluyor.

Ana ekranın yüksekliğini alarak, durum çubuğunun yüksekliğini ve gezinme çubuğunun yüksekliğini çıkararak yüksekliği kendim hesaba katabileceğimi biliyorum, ancak bu gereksiz ekstra çalışma gibi görünüyor.

Bu sorunu yaşayan başka biri var mı?

GÜNCELLEME:

Bu özel sorun için bir çözüm buldum. Gezinme çubuğunun yarı saydam özelliğini HAYIR olarak ayarlayın:

self.navigationController.navigationBar.translucent = NO;

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

Ancak, gezinme çubuğunun yarı saydam olmasını istediğinizde durum için bir düzeltme bulamadım. Örneğin, bir fotoğrafı tam ekran görüntülerken, gezinme çubuğunun yarı saydam olmasını ve altında görüntünün çerçevelenmesini istiyorum. Bu işe yarıyor, ancak gezinme çubuğunu göstermeyi / gizlemeyi değiştirdiğimde, daha da garip sonuçlar aldım. İlk alt görünüm (a UIScrollView), sınırlarını y başlangıç ​​noktasına her seferinde değiştirir.


4
Beta yazılımı. Apple geliştirici forumları daha uygundur. Ayrıca, sorun geçiş kılavuzunda açıkça belirtilmiştir.
Sulthan

Yanıtlar:


188

Bu tamamen doğru değil. İOS 7'de, düzen davranışını iOS'un önceki sürümlerinde olduğu gibi ayarlamanıza izin veren yeni bir özellik sunulmuştur. Bu kod parçasını görünüm denetleyicinize yerleştirin ve gitmekte fayda var! Gezinme çubuğunuzun kapladığı alan otomatik olarak hesaba katılmalıdır

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

Yukarıdakileri -(void)viewDidLoadyönteminize eklemeniz gerekir .

Not: API beta sürümlerinden değiştiğinden şu anda iOS 7 ve Xcode 5'in en son GM sürümünü kullanıyor olmalısınız.


Kodumda edgeForExtendedLayout yazıyor. UIExtendedEdgeNone bildirilmemiş tanımlayıcının kullanımı. Lütfen yardım et.

6
UIRectEdgeNone
Simon olarak

6
İşte böyle bir sorunun burada sorulmamasının veya cevaplanmamasının nedeni de budur.
Sulthan

Neden ios6 ile uyumluluğu korumak istiyorsanız, denetleyicinin bu özelliğe sahip olup olmadığını kontrol etmek için bir koşullu durum sunmaya zorlandığınızı anlamıyorum ..
jerrygdm

12
Bu, yalnızca görünüm bir UINavigationController içine katıştırılmışsa işe yarıyor gibi görünüyor.
pojo

37

Film şeridinden ekran görüntüsü

Storyboard'da çalışıyorsanız (ki bunu şiddetle tavsiye ederim!) Çözüm şudur: Storyboard'da ViewController'ınızın "Extend Edges" özelliğini devre dışı bırakabilirsiniz. Bunu her viewController için yapmanız gerekir. Stortyboard'daki (görünümün altındaki productOwner'ın yanında) viewController simgesini tıklayıp ardından nitelik denetçisini seçerek (Resimlerin gösterdiği gibi) genişletilmiş kenarları devre dışı bırakabilirsiniz.

Bu aynı zamanda iOS 6 gibi hizalama çizgilerini de ayarlayacaktır.

XCode 5'te bir başka harika araç "Önizleme" dir: butler Düğmesine (yardımcı düzenleyici) tıklayın ve Önizleme'yi seçin. orada iOS 6'yı seçebilir ve film şeridi tasarımınızın iOS 6'da nasıl görüneceğini görebilirsiniz.

Harika: D

[Güncelleme]

Dikkatli olun: "Kenarları Uzat" ı devre dışı bırakmak, uygulama iOS7'de arka plana girdiğinde gezinme çubuğunda siyah bir parıltıya neden olabilir. parıltı çoklu görev görünümünde de görünecektir (ana sayfa düğmesine iki kez basın). bu, gezinme çubuğu görünümünün arka plan rengini beyaza ayarlayarak çözülebilir.

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];

Evet, storyboard perspektifinden gelen çözüm budur. Teşekkür ederim.
jpittman

12

OP'nin dediği gibi, bunun için basit bir çözüm var; gezinme çubuğunu opak olacak şekilde ayarlamak. Bunu kodda yapmak yerine, kök gezinme çubuğunuz için "Yarı Saydam" seçeneğinin işaretini kaldırmanız yeterlidir:

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


8

self.edgesForExtendedLayout=UIRectEdgeNone;

İOS 7 simülatöründe (Xcode 5 DP5) çalışır


2
bu ios7'de iyi çalışıyor ancak uygulamayı ios 6 ve daha önceki sürümlerde çalıştırırsam görünümler yukarı taşınır. Bunun için herhangi bir çözüm var mı? Ayrıca bu özelliği her view controller viewdid load metodunda ayarlamamız gerekiyor mu?
loganathan

Şu durumlarda mevcut iOS'un 7 olup olmadığını her zaman kontrol edebilirsiniz:if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
Aviel Gross

2

bu cevapların hepsi, özellikle de MQoder's yardımcı oldu, ancak benim için varsayılan üst çubuğu "opak siyah gezinme" olarak ayarlamak zorunda kaldım.

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


1

@One Man Crew'un cevabı doğru, ancak:

Uygulamayı eski sürümlerde çalıştırırken hataları önlemek için bu kodu kullanmanızı tavsiye ederim:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif

0

self.edgesForExtendedLayout = UIRectEdgeNone;

Ve bunu AppDelegate # uygulamasında yapmanız gerekir: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

Aksi takdirde Gezinme Çubuğunun arka plan rengi griye dönüşür. Çünkü şeffaf Gezinti Çubuğu pencereyle örtüşüyor.


0

Kullanıcı tablo görünümünüzü kaydırdığında şeffaflığı korumak istiyorsanız, bunun contentInset değerini ayarlayabilirsiniz:

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);

-1

Çözümlerden biri, Navigasyon Denetleyicisini kullanmaktır. Bu, sorunu otomatik olarak çözer. Ayrıca beta sürümler olduğu için Xcode Preview sürümleri yerine Xcode 5 kullanın.

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.