İOS7'de otomatikAdjustsScrollViewInsets, extendedLayoutIncludesOpaqueBars, edgeForExtendedLayout arasındaki farkı açıklama


250

İOS7 UI geçişi hakkında çok şey okuyorum.

Ne bu üç özelliklerini almak mümkün değilim automaticallyAdjustsScrollViewInsets, extendedLayoutIncludesOpaqueBars, edgesForExtendedLayout??

Örneğin, görünüm denetleyicilerimin durum çubuğunun altında başlamasını sağlamaya çalışıyorum, ancak bunu başaramıyorum.


5
ve neden bunu okumadığımı düşünürsünüz? .. Sorun şu ki ben iyi anlamadım olduğu gibi beklendiği gibi çalışmıyor !! .. bu nedenle
user1010819

1
Ohhh orada ne dediğini yanlış anladım. Kulağa patronluk gibi gelmeye çalışmıyordum, sadece bazı insanlar böyle sorular sorduğunda ve sitede yeni olduklarında, bariz çözümleri kaçırıyorlar.
erdekhayser

8
ViewDidLoad yönteminizde if ([self yanıtlarToSelector: @selector (sidesForExtendedLayout)]) self.edgesForExtendedLayout = UIRectEdgeNone; bu da görünümünüzü durum çubuğunun altında başlamaya zorlar.
Nandha

Yanıtlar:


629

İOS7'den başlayarak, görünüm denetleyicileri varsayılan olarak tam ekran düzenini kullanır. Aynı zamanda, görüşlerini nasıl düzenlediği üzerinde daha fazla kontrole sahipsiniz ve bu, bu özelliklerle yapılır:

edgesForExtendedLayout

Temel olarak, bu özellik ile görünümünüzün hangi taraflarının tüm ekranı kapsayacak şekilde genişletilebileceğini ayarlayabilirsiniz. Eğer bir itme düşünün UIViewControllerbir içine UINavigationController. Bu görünüm denetleyicisinin görünümü düzenlendiğinde, gezinme çubuğunun bittiği yerde başlar, ancak bu özellik görünümün hangi taraflarının (üst, sol, alt, sağ) tüm ekranı kaplayacak şekilde genişletilebileceğini ayarlar.

Bir örnekle görelim:

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

Burada değerini ayarlamıyorsunuz edgesForExtendedLayout, bu nedenle varsayılan değer alınır ( UIRectEdgeAll), böylece görünüm tüm ekranı dolduracak şekilde düzenini genişletir.

Sonuç budur:

genişletilmiş düzen için kenarlar olmadan, görünüm tüm ekranı doldurur

Gördüğünüz gibi, kırmızı arka plan gezinme çubuğunun ve durum çubuğunun arkasına uzanır.

Şimdi bu değeri şu şekilde ayarlayacaksınız UIRectEdgeNone, bu nedenle görünüm denetleyicisine görünümü ekranı kaplayacak şekilde genişletmemesini söylüyorsunuz:

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
viewController.edgesForExtendedLayout = UIRectEdgeNone;
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

Ve sonuç:

ForExtendedLayout seti ile görünüm gezinmenin hemen altında


automaticallyAdjustsScrollViewInsets

Bu özellik, görünümünüz a. UIScrollViewVeya benzeri gibi olduğunda kullanılır UITableView. Tablonuzun gezinme çubuğunun bittiği yerden başlamasını istersiniz, çünkü eğer tüm içeriği görmezsiniz, fakat aynı zamanda kaydırma sırasında tablonuzun tüm ekranı kaplamasını istersiniz. Bu durumda, edgesForExtendedLayoutYok'u ayarlamak çalışmaz çünkü tablonuz gezinme çubuğunun bittiği yerde kaymaya başlayacaktır ve arkasına gitmeyecektir.

Görünüm denetleyicisinin ekleri otomatik olarak ayarlamasına izin verirseniz (bu özelliği EVET'e, varsayılan değeri de ayarlar), tablonun üstüne ekler ekleyeceği şekilde burada bu özellik kullanışlı olur. çubuğu sona erer, ancak kaydırma tüm ekranı kaplar.

NO olarak ayarlandığında:

tablo tüm ekran boyunca kayacak, ancak kısmen kaplanmış olarak başlayacak

Ve EVET (varsayılan olarak):

tablo tüm ekranın üzerinde kayar ve navigasyonun hemen altında başlar

Her iki durumda da, tablo gezinme çubuğunun arkasında kayar, ancak ikinci durumda (YES), gezinme çubuğunun altından başlar.


extendedLayoutIncludesOpaqueBars

Bu değer sadece öncekilere bir ektir. Varsayılan olarak, bu parametre NO olarak ayarlıdır. Durum çubuğu opak ise, görünümler bunu (kapsayacak şekilde görünümünüzü uzatmak bile, durum çubuğu eklemeyi uzatılmayacağını edgesForExtendedLayoutiçin UIRectEdgeAll).

Değeri EVET olarak ayarlarsanız, görünüm tekrar durum çubuğunun altına girer.

Bir şey net değilse, bir yorum yazın, ben de cevaplayacağım.

İOS ne UIScrollView kullanacağını nasıl biliyor?

iOS, ViewController görünümünüzdeki ilk alt görünümü, dizin 0'da olanı alır ve alt sınıfı ise UIScrollView, açıklanan özellikleri buna uygular.

Tabii ki, bu UITableViewControllervarsayılan olarak çalıştığı anlamına gelir (çünkü UITableViewilk görünümdür).


Bu özellikleri yalnızca, özelleştirilmiş gezinme çubuğu göstermiyorsa varsayılan gezinme çubuğunu gösteriyorsak ayarlamalıyız, değil mi?
Hemang

1
Hayır, iOS gezinme çubuğunu kullanıyorsanız ancak kendi tasarımınızla aynı özellikleri kullanmanız gerekir. Gezinme çubuğunuzu sıfırdan oluşturursanız, bu özellikler çalışmaz.
Antonio MG

Neden tüm görünüm üzerinde küçük bir siyahımsı katman geliyor anlamıyorum? Lütfen yardım et? : /
aZtraL-EnForceR

24
Bu açıklama iOS 7 UI Geçiş Kılavuzu'ndan çok daha iyi. Bu sadece benim için hiçbir anlam ifade etmeyen kılavuzu değiştirmelidir.
Sam

2
ExtendedLayoutIncludesOpaqueBars, NO yerine varsayılan olarak EVET gerektiğini düşünüyorum. Görünüm renklerinin (yarı saydamlık) değiştirilmesi düzeni etkilememelidir.
Vladimír Slavík

15

Film şeridi kullanıp kullanmadığınızdan emin değilsiniz, ancak görüntüleme denetleyicilerinizi durum çubuğunun altında (ve alt çubuğun üstünde) başlatmak için:

IB'de görünüm denetleyicisini seçin, Özellik denetçisinde 'Kenarları Uzat - Üst Çubukların Altında' ve 'Kenarları Uzat - Alt Çubukların Altında' seçimini kaldırın.


TAMAM. O zaman Nandha'nın yukarıda önerdiği şey aynı sonucu programlı olarak elde edeceğini düşünüyorum. ViewDidLoad altında çalışmazsa viewDidLayoutSubviews klasörüne taşınması gerekebilir.
Ali Beadle

Genişletilmiş mizanpajın opak çubuklar içerip içermediğini gösterir. @property (anatomik olmayan, ata) BOOL extendedLayoutIncludesOpaqueBars Tartışma Varsayılan değer NO'dur.
Abdul Yasin

+1, Storyboard'a bakmam için bana bir ipucu verdin. Ve sorunumun yarısını çözdüm.
selva

10

Görsel senaryo taslakları kullanıyorum ve yukarıdaki tavsiyeyi kullandım, ancak nasıl uygulanacağından tam olarak emin değildim. Aşağıda, önerilen çözümü ViewController'a koyarak sorunun nasıl çözüldüğüne dair kısa bir örnek verilmiştir.

import Foundation
import UIKit

// This ViewController is connected to a view on a storyboard that 
// has a scrolling sub view.
class TheViewController: UIViewController {

  // Prepares the view prior to loading.  Putting it in viewDidAppear didn't work.
  override func viewWillAppear(animated: Bool) {

    // this method is an extension of the UIViewController 
    // so using self works as you might expect.
    self.automaticallyAdjustsScrollViewInsets = false

    // Default is "true" so this sets it to false tells it to use 
    // the storyboard as you have it placed
    // and not how it thinks it should place it.
  }

}

Sorunum: Film şeridi tasarımı ve simülatör arasında fark yaratan varsayılan olarak Otomatik Ayarlama doğru Film şeridi tasarımı ve simülatör arasında fark yaratan varsayılan olarak Otomatik Ayarlama doğru olarak ayarlanmıştır

Çözüldü: Yukarıdaki kod uygulandı, otomatik ayar kapatıldı. Yukarıdaki kod uygulandı, otomatik ayar kapatıldı.


5
automaticAdjustsScrollViewInsets öğesini YES olarak açarsanız, topGuideLayout'u denetlemek için üst kısıtlamayı ayarlamanız gerekir.
xmkevinchen

5

Bu satır ekleyerek bu sorunu çözmüş ama benim problem ilgiliydi UIViewdeğilUIScrollView

self.navigationController.navigationBar.translucent = NO;

2

Sadece akılda çıplak automaticallyAdjustsScrollViewInsets mülkiyet kaydırma görünümünde bir tür (tablo görünümü, toplama görüntüsü, ...) ya olması durumunda çalışır

  • VC görünümü veya
  • Bu görüşün ilk alt görünümü

Diğerleri, ilk alt görünüm olsa bile işe yaradığını, ancak görünüm hiyerarşisinde başka kaydırma görünümleri olduğunu önerdi.

EDIT (uzatma DIY)

Bu koşulları yerine getiremeseniz bile benzer bir davranış istiyorsanız (örn. Kaydırma görünümünün altında bir arka plan resminiz var), kaydırma görünümü iç metinlerini manuel olarak ayarlayabilirsiniz. Ama lütfen 44 veya 64 gibi sabit olarak ayarlamayın, hatta çoğu SO'nun önerdiği gibi 20. Boyutu asla bilemezsiniz. Incall / gps / sesli bildirim olabilir, gezinme çubuğunun her zaman 44 puan olması gerekmez.

Bence en iyi çözüm, layoutGuide'ı lengthdidLayoutSubviews'te kullanmaktır :

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    scrollView.contentInset = UIEdgeInsets(top: topLayoutGuide.length, left: 0, bottom: 0, right: 0)
    scrollView.scrollIndicatorInsets = scrollView.contentInset
}

BottomLayoutGuide'ı aynı şekilde kullanabilirsiniz.


Ve tabii ki gezinti çubuğu yarı saydamdır.
Vojta Rujbr
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.