iOS 7: UITableView durum çubuğu altında gösteriliyor


219

Uygulamamın ilk ekranı UITableViewControllergezinme çubuğu olmayan bir, yani içerik durum çubuğunun altına akıyor, bu yüzden çok fazla metin çarpışması oluyor. Ben hem özellikleri ayarlanmış Under top barsve Adjust scroll view insetshangi gerçekten kaydırma altında durdurmak, ama altında tablo görünümünün üst tutmak pahasına. UITableViewÇerçeveyi 20 piksel dengelemek için ayarlamaya çalıştım , ancak etkili görünmüyor ve şu anda uygulamanın iOS 6 ile uyumlu olması gerektiğinden, otomatik yerleşimi kullanmaya zorlamak için iOS 7 Storyboard'larına atlayamıyorum üst yükseklik kılavuzu. Herkes her iki sürüm için de uygun bir çözüm buldu mu?

Denedim şeyler: ayar edgesForExtendedLayoutiçin Film Şeridi 'dahilinde ayarlarını değiştirerek Under top barsve Adjust scroll viewyeni bir alana çerçeveyi zorlayarak.

Bir resim bin kelime değerinde bir olup: Durum çubuğu akışı altında


2
Hızlı bir çözüm, iOS 7'de çalışırken masaya 20 piksellik boş bir başlık eklemek olabilir
EricS

@EricS: Zaten UITableVieworada bir başlığım var, ayrıca durum çubuğunun altına akıyor.
Nicholas Smith

İOS 6'da otomatik düzen kılavuzunu neden kullanmıyorsunuz? İşe yarıyor.
Steven Fisher

Yanıtlar:


366

Bunu çoğaltmak isteyen herkes için aşağıdaki adımları uygulamanız yeterlidir:

  1. Yeni bir iOS projesi oluşturun
  2. Ana film şeridini açın ve varsayılan / ilk harfi silin UIViewController
  3. UITableViewControllerNesne Kitaplığından yeni bir tane sürükleyin
  4. İlk görünüm denetleyicisi olarak ayarla
  5. Tabloya bazı test verileri verin

Yukarıdaki adımları uygularsanız, uygulamayı çalıştırdığınızda, Xcode'un onay kutularını "Üst, Alt, Opak} Çubuklar Altında Kenarları Genişlet" seçeneğine ayarlamak da dahil olmak üzere hiçbir şeyin ilk satırın durum çubuğunun altında görünmesini durdurmak için işe yaramayacağını, bunu programlı olarak da ele alamazsınız.

Yukarıdaki senaryoda, aşağıdakilerin hiçbir etkisi olmayacaktır :

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;

Bu sorun çok sinir bozucu olabilir ve özellikle Apple'ın ucunda bir hata olduğuna inanıyorum, özellikle UITableViewControllernesne kitaplığından önceden kablolanmış olarak göründüğü için.

Bunu "Sihirli Sayılar" herhangi bir formunu kullanarak çözmeye çalışan herkesle aynı fikirde değilim, örneğin "20 piksel bir delta kullanın". Bu tür sıkı bir programlama kesinlikle Apple'ın burada yapmamızı istediği şey değildir.

Bu soruna iki çözüm keşfettim:

  • Koruma UITableViewController'ın sahne :
    Saklamak istiyorsanız UITableViewControllermanuel olarak başka görünüm içine yerleştirerek olmadan Film şeridinde, Katıştırabilirsiniz UITableViewControllera'daUINavigationController (Editör> Yerleştir> Gezinti Denetleyici) ve denetçide "Gezinme Çubuğunu " seçeneğinin işaretini . Bu, ekstra bir tweaking gerektirmeden sorunu çözer ve ayrıca UITableViewControllerfilm şeridindeki sahnenizi korur .

  • AutoLayout'u kullanma ve UITableViewbaşka bir görünüme katma (Apple'ın bunu yapmamızı istediğine inanıyorum) :
    Boş bir dosya oluşturun UIViewControllerve içine sürükleyin UITableView. Ardından, Ctrl tuşuna basarakUITableView durum çubuğuna doğru . Fare durum çubuğunun altına geldiğinde, "Üst Düzen Kılavuzu" yazan bir Otomatik Düzenleme balonu görürsünüz. Fareyi bırakın ve "Dikey Aralık" ı seçin. Bu, düzen sistemine durum çubuğunun hemen altına yerleştirmesini söyleyecektir.

Boş bir uygulamada her iki yolu da test ettim ve ikisi de çalışıyor. Projeniz için işe yaraması için biraz daha ince ayar yapmanız gerekebilir.


5
FYI, seçenek 1 (gezinme denetleyicisine katıştırma), tabloyu kaydırdığınızda hücrelerin yarı saydam durum çubuğunun arkasında görünmesine neden olur.
RyanR

4
@RyanR Ben de fark ettim, ama sanırım bir noktada sorun yok. Apple mobil Safari'nin açık sekmeler görünümünde de aynı şeyi yaptı, sekmeler durum çubuğunun altında görüntülenecek. Gezinti denetleyicisi çözümü en basit çözümdür, bunun için kök salıyorum. Ancak, yarı saydam durum çubuğu aptalca bir fikirdir.
Pride Chung

6
Kontrol görünümünden tablo görünümünü yukarı sürüklediğimde, durum çubuğuna hiç girmiyorum. Görünümde görünür bir durum çubuğu yok, burada ne demek istediğinizden emin değilim ...
Jesse

4
Seçenek 2 artık Xcode 5'te çalışmıyor . Açıklanan sisteme ait olduğu için açıklanan eylem (ctrl-drag) hiçbir zaman çalışmamış olmalıdır, ancak soldaki Sahne Ağacı'na manuel olarak sürükleseniz bile, üst düzen kılavuzu ÇALIŞMAZ (öyle olmalı, AFAICT - Bunun AutoLayout'taki başka bir büyük hata olduğuna inanıyorum :( :()
Adam

3
Tablo görünümü ile bir başlık kullanırken aptal görünüyor, başlık üstte sabit kalıyor ve elemanlar geride kaybolacak ve şeffaf durum çubuğunun arkasında görünecek ...
Ixx

86

Bir şeyi programlı olarak yapıyorsanız ve a UITableViewControllerolmadan kullanıyorsanız UINavigationControlleren iyi seçenek aşağıdakileri yapmaktır viewDidLoad:

Hızlı 3

self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

Daha erken Swift

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);

UITableViewControllerHala durum çubuğunda arkasında kayar ama üst kaydırıldığında bunun altında olmayacaktır.


1
İşletim sistemi sürümü> 7 için bir kontrol ekleyebilir ve daha eski işletim sistemlerini de destekleyebilirsiniz (bunlar için ek yoktur). Aksi takdirde bu benim için iyi çalıştı.
SimpsOff

8
Hardcoding height değeri en iyi fikir değildir.
Maciej Kozieł

3
Evet, topLayoutGuidebunun yerine uzunluğu kullanın.
lipka

10
UIApplication.sharedApplication.statusBarFrame.size.height20 yerine kullanırım .
mojuba

Bu, bu günlerde UIApplication.shared.statusBarFrame.size.height olarak güncellendi.
asetniop

23

Lütfen dikkat: Bu, aşağıdaki yapılandırma için benim için çalıştı:

  • Ekranın üstünde gezinme çubuğu yok (tablo görünümü durum çubuğuyla buluşuyor)
  • Tablo görünümü kaydırılamaz

Yukarıdaki iki gereklilik karşılanmıyorsa, göçünüz değişebilir.

Orijinal Mesaj

Görüşümü programlı olarak oluşturdum ve bu benim için çalıştı:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

Kaynak (sayfa 39'un altındaki topLayoutGuide bölümünde).


İlginç ... Hiç sorun yaşamadan projemde böyle diyebildim ... Ancak sizden daha basit bir görünüm düzeni yapısına sahip olabilirim. Öneriniz doğru, cevabımda bu değişikliği yapacağım.
Stunner

Uygulamamı döndürdüğümde sorunla karşılaştım. Döndürmeyi devre dışı bıraktıysanız, büyük olasılıkla bir sorununuz olmaz.
Jeremy

Projemde rotasyon etkin değil ve sorunla karşılaştım, ama evet, yine de iyi bir nokta.
Stunner

1
Kendi Konteyner denetleyicisini uygulayan herkes için, bu durum veya gezinme çubuğu örtüşmesi için doğru ayar yöntemidir!
Rafael Nobre

Başlangıç ​​noktasını değiştirir ancak görünüm sınırlarının yüksekliğini değiştirmezseniz, alt kısım ekranın alt kenarı tarafından başlangıç ​​noktasını değiştirdiğiniz miktarda kırpılmaz mı? (böylece son birkaç piksel
satırını

20

En üstteki cevaba ekleme:

2. yöntem başlangıçta işe yaramadı sonra bazı ek müdahalesi yaptım ve çözüm bulduk.

TLDR; üstteki cevabın 2. çözümü neredeyse işe yarıyor, ancak bazı xCode ctrl + sürümleri için "Üst Mizanpaj Kılavuzu" na sürüklemek ve Dikey Boşluk seçmek hiçbir şey yapmıyor. Ancak, önce Tablo Görünümü'nün boyutunu ayarlayıp "Üst Boşluktan Üst Yerleşim Kılavuzu" nu seçerek çalışır


  1. Boş bir ViewController'ı film şeridine sürükleyin. Denetleyiciyi Görüntüle

  2. Bir UITableView nesnesini görünüme sürükleyin . (UITableViewController değil). Mavi mizanpaj kılavuzlarını kullanarak tam merkeze yerleştirin.

Tablo görünümü Ortadaki Görüntü

  1. Bir UITableViewCell'i TableView'e sürükleyin. Bu, prototip yeniden kullanım hücreniz olacak, bu yüzden Öznitelikler sekmesi altında Yeniden Kullanım Tanımlayıcısını ayarlamayı unutmayın veya bir kilitlenme alırsınız.

Tablo Görünümü Hücresi Ekle Tanımlayıcıyı Yeniden Kullan

  1. Özel UIViewController alt sınıfınızı oluşturun ve <UITableViewDataSource, UITableViewDelegate>protokolleri ekleyin . Storyboard'unuzun ViewController'ını Kimlik Denetçisinde bu sınıfa ayarlamayı unutmayın.

  2. Uygulama dosyanızda TableView için bir çıkış oluşturun ve "tableView" olarak adlandırın

Çıkış Oluştur tablo görünümü

  1. TableView sağ tıklatın ve hem dataSource hem de temsilci ViewController sürükleyin.

dataSource delegesi

Şimdi durum çubuğuna kırpmama kısmı için.

  1. Tablo Görünümünüzün üst kenarından tutun ve üst tarafa yakın kesikli mavi otomatik düzen kılavuzlarından birine taşıyın

boyutlandırma

  1. Artık Tablo Görünümü'nden en üste sürüklemeyi kontrol edebilir ve Üst Alandan Üst Düzene Kılavuzu'nu seçebilirsiniz.

En Üstteki Yerden En Üst Yerleşim Kılavuzu

  1. Bu, TableView'in belirsiz mizanpajı hakkında bir hata verecektir, sadece Eksik Kısıtlamalar Ekleyin ve işiniz bitti.

Eksik Kısıtlamalar Ekleme

Artık tablo görünümünüzü normal gibi ayarlayabilirsiniz ve durum çubuğunu kırpmaz!


11
- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1


2
<= konumuna> geçin ve blok ise boş
olanı

1
Okuma self.topLayoutGuide.lengthgelen viewDidLayoutSubviewsçocuk görünümleri düzenini berbat edecektir.

@OLzh açıkladığınız gibi, self.tableView kaydırma yapamaz.
DawnSong

8

Film şeridinizde UIViewController'ı seçin ve Üst Çubukların Altında Kenarları Genişlet seçeneğinin işaretini kaldırın. Benim için çalıştı. :)


Ne yazık ki, benim için çalışmadı. Tamamen varsayılan UITableViewController durum çubuğuyla çakışıyor. Durum çubuğunun bir Üst Çubuk olduğunu düşünmüyorum. Sadece gezinme çubukları ve sekme çubukları.
Andrew Duncan

Benim için çalışan tek çözüm ty. (IB'deki durum çubuğunun altındaki tablo görünümünü "kısaltmanız" ve kısıtlamaları unutmayın).
Martin Makarsky

Benim için bir UITableViewController ile Xcode 8 üzerinde çalıştı.
Edouard Barbier

8

"Swift" dilinde şöyle yazılır: @ lipka'nın cevabına bir ayarlama:

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)

Burada hızlıca izin verilmiyor mu?
uplearnedu.com

Sadece benim için çalışan bir çözüm, bu beni bir UIVIewController yaratmama neden değil
Shereef Marzouk

1
İdeal olandan daha azdır, çünkü ios8'de varsayılan durum çubuğunun olmadığı manzarada bile üst iç kısmı 20'de tutar
voidref

Bu varyasyon benim için herhangi bir yapılandırmayı iyi - (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
işliyor

5

Xcode 7 için, Gezinti Çubuğu'nun 'yarı saydam' onay işaretinin işaretini kaldırmak benim için çalıştı.

resim açıklamasını buraya girin


En basit, en hızlı, en kolay, en güvenli? çözüm. Bunun neden her şeyle karşılaştırıldığında bu kadar az oyu olduğunu bilmiyorum.
Mart'ta Gruntcakes

3

Bu, UITableViewController (sihirli numaralar olmadan) için düzeltir. Düzeltmek için alamadım tek şey, bir telefon görüşmesi yapıyorsanız, bu durumda tableView üst çok aşağı itilir olduğunu. Eğer kimse bunu nasıl çözeceğini biliyorsa, lütfen bize bildirin.

class MyTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()    
        configureTableViewTop()
    }

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition({ (context) -> Void in
            }, completion: { (context) -> Void in
                self.configureTableViewTop()
        })
    }

    func configureTableViewTop() { 
        tableView.contentInset.top = UIApplication.sharedApplication().statusBarFrame.height
    }
}

2

Nasıl Kosher olduğunu bilmiyorum, ama bu şema ViewController'ın görünümünü aşağı taşır ve durum çubuğuna sağlam bir arka plan sağlar:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Shove everything down if iOS 7 or later
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0f) {

        // Move the view down 20 pixels
        CGRect bounds = self.view.bounds;
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];

        // Create a solid color background for the status bar
        CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
        UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
        statusBar.backgroundColor = [UIColor redColor];
        [self.view addSubview:statusBar];
    }

Tabii ki değiştirin redColor arka plan için istediğiniz renkle .

Durum çubuğundaki karakterlerin / simgelerin rengini ayarlamak için swizzles'tan ayrı olarak yapmanız gerekir. Kullanıyorum View controller-based status bar appearance = NOveStatus bar style = Opaque black style plist, bu tüm dünyada yapmak.

Çalışıyor gibi görünüyor ve ben onunla herhangi bir hata veya sorunları duymak ilginizi çekecek.


2

chappjc'nin cevabı XIB'lerle çalışırken harika çalışıyor.

TableViewControllers programlı olarak oluştururken en temiz çözüm bulundu UITableViewController örneği başka bir UIViewController kaydırma ve buna göre kısıtlamaları ayarlayarak.

İşte burada:

UIViewController *containerLeftViewController = [[UIViewController alloc] init];
UITableViewController *tableViewController = [[UITableViewController alloc] init];

containerLeftViewController.view.backgroundColor = [UIColor redColor];

hostsAndMoreTableViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
[containerLeftViewController.view addSubview:tableViewController.view];

[containerLeftViewController addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:containerLeftViewController];

NSDictionary * viewsDict = @{ @"tableView": tableViewController.view ,
                              @"topGuide": containerLeftViewController.topLayoutGuide,
                              @"bottomGuide": containerLeftViewController.bottomLayoutGuide,
                              };
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide][tableView][bottomGuide]"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];

Şerefe, Ben


1

Ben UITableViewController kullanma yaklaşımı daha önce yaptığınızdan biraz farklı olabilir düşünüyorum. Benim için çalıştı, ama onun hayranı olmayabilirsin. Ne yaptım benim UItableViewController işaret bir konteyner manzaralı bir görünüm denetleyicisi var. Bu şekilde, film şeridimde sağlanan TopLayoutGuide'ı kullanabiliyorum. Kısıtlamayı kapsayıcı görünümüne eklemeniz yeterlidir; hem iOS7 hem de iOS6 ile ilgilenmeniz gerekir.


1

İstediğiniz arka plan ile ekstra bir görünüm kullanarak sona erdi, TableView sonra eklendi ve durum çubuğunun altına yerleştirilir:

    self.CoverView = [[UIView alloc]init];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

    self.CoverView.frame = CGRectMake(0,0,self.view.bounds.size.width,20);
    }

    self.CoverView.backgroundColor = [UIColor whiteColor];
    self.TableView = [[UITableView alloc]initWithFrame:CGRectMake(0,
    self.CoverView.bounds.size.height,XXX, YYY)];
    [self.view addSubview:self.TableView];
    [self.view addSubview:self.CoverView];

Çok hoş değil, ama xib'siz görünümlerle ve hem IOS6 hem de IOS7 ile çalışmaya ihtiyacınız varsa oldukça basit bir çözüm.


1

Retina / Retina olmayan ekran için bunu yaptım

BOOL isRetina = FALSE;

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        isRetina = TRUE;
    } else {
        isRetina = FALSE;
    }
}

if (isRetina) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}

1

Aşağıdaki çözüm, sihirli sabitleri kullanmadan kodda yeterince iyi çalışır ve kullanıcının boyut sınıfını değiştirmesini, örneğin ipad'lerde döndürmeler veya yan yana uygulamalar aracılığıyla açıklar:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    // Fix up content offset to ensure the tableview isn't underlapping the status bar.
    self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0);
}

1

Hızlı 3 için çalışır - viewDidLoad ();

let statusBarHeight = UIApplication.shared.statusBarFrame.height

let insets = UIEdgeInsets(top: statusBarHeight, left: 0, bottom: 0, right: 0)
tableView.contentInset = insets
tableView.scrollIndicatorInsets = insets

Bu kod: 1. Durum çubuğunun yüksekliğini alır 2. Tablonun üst kısmına durum çubuğunun yüksekliğine eşit bir içerik eki görüntüler. 3. Kaydırma göstergesine aynı iç metin verir, böylece durum çubuğunun altında görünür.


1

Benim gibi onların UITableViewControlleriçine gömmek istemeyenler içinUIViewController deneyin içine :

Özel bir UITableViewControlleralt sınıf, tableView denetimine maske görünümü ekleyebilir. Maskeyi viewDidAppear öğesine ekleyin ve maskeyi viewWillDisappear öğesinden kaldırın.

private var statusBarMaskView: UIView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let superview = self.tableView.superview {
        self.statusBarMaskView = UIView(frame: CGRect.zero)
        superview.insertSubview(self.statusBarMaskView, aboveSubview: self.tableView)
        self.statusBarMaskView.backgroundColor = self.tableView.backgroundColor

        // using a nice constraint layout library to set the frame
        self.statusBarMaskView.pinTop(to: superview)
        self.statusBarMaskView.pinLeft(to: superview)
        self.statusBarMaskView.pinRight(to: superview)
        self.statusBarMaskView.addHeightConstraint(with: 22.0)
        ////
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.statusBarMaskView.removeFromSuperview()
    self.statusBarMaskView = nil
}

0

Benim UITableView üstünde bir UISearchBar vardı ve aşağıdaki çalıştı;

self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
self.tableView.contentOffset = CGPointMake(0, -20);

Paylaş ve Keyfini çıkar...



0

Abrahamchez'in çözümü https://developer.apple.com/library/ios/qa/qa1797/_index.html benim için aşağıdaki gibi çalıştı. İlk görüşüm olarak tek bir UITableviewcontroller vardı. Ofset kodunu denedim ve bir navcon'a gömdüm, ancak statusbar şeffaflığını çözmedim.

Bir Viewcontroller ekleyin ve ilk görünüm yapın. Bu, kritik Üst ve Alt Mizanpaj Kılavuzlarını göstermelidir.

Eski Tablo Görünümü'nü yeni denetleyicideki Görünüm'e sürükleyin.

Masayı yeni denetleyiciye uyarlamak için her şeyi yapın:

Eski görünüm controller.h dosyanızı UITableViewController yerine UIViewController'dan miras / alt sınıf olarak değiştirin.

Viewcontroller's .h dosyasına UITableViewDataSource ve UITableViewDelegate ekleyin.

Film şeridinde gereken Arama Çubuğu gibi her şeyi yeniden bağlayın.

Önemli olan, Apple Q&A'da olduğu gibi kısıtlamaları ayarlamaktır. Bir araç çubuğu eklemekle uğraşmadım. Tam sıradan emin değilim. Ancak, Düzenleme Kılavuzlarında, belki de inşa ettiğimde kırmızı bir simge belirdi. Tıkladım ve Xcode'un kısıtlamaları yüklemesine / temizlemesine izin verdim.

Sonra Dikey Boşluk kısıtlamasını bulana kadar her yeri tıkladım ve en yüksek değerini -20'den 0'a değiştirdim ve mükemmel çalıştı.


0

Bir navigationcontroller ve tableviewcontroller ile bir UISplitViewController kullanıyorum. Bu, burada birçok çözüm denedikten sonra ana görünümde benim için çalıştı:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {

    // Move the view down 20 pixels
    CGRect bounds = self.view.bounds;
    bounds.origin.y -= 20.0;
    [self.navigationController.view setBounds:bounds];

    // Create a solid color background for the status bar
    CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
    UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
    statusBar.backgroundColor = [UIColor whiteColor];
    [statusBar setAlpha:1.0f];
    [statusBar setOpaque:YES];
    [self.navigationController.view addSubview:statusBar];
}

Hot Licks'in çözümüne benzer, ancak alt görünümü navigationController'a uygular.


Bu, iOS 8'de benim için çalışan tek cevap!
SamB

0
override func viewDidLoad() {
 // your code

 if let nc = self.navigationController {
   yourView.frame.origin.y = nc.navigationBar.frame.origin.y + nc.navigationBar.frame.height
  }
}

0

İşte Swift 2.3. (Xcode 8.0) çözümü. Bir alt sınıf UITableView oluşturduk.

class MYCustomTableView: UITableView
{   
    override func drawRect(rect: CGRect) {
        super.drawRect(rect)
        contentInset    = UIEdgeInsetsZero
    }
}

İçerik Ek'i her zaman Sıfır olmalıdır (varsayılan olarak). Elle sıfır olarak ayarlıyorum. Ayrıca, kontrolü yapan bir kontrol yöntemi de ekleyebilirsiniz. Değişiklik yalnızca tablo görünümü çizildiğinde (bu çok sık gerçekleşmez) yansıtılacaktır.

IB'nizdeki TableView'i güncellemeyi unutmayın (TableViewController'da veya sadece ViewController'ınızın içindeki TableView).


0

Ios 11'de bu sorunla karşı karşıya kaldım, ancak düzen ios 8 - 10.3.3 için doğruydu. Benim durumum için ios 8-11 için çalışan Superview.Top yerine Superview.Top Margin yerine bir Dikey Boşluk Sınırlaması ayarladım.

resim açıklamasını buraya girin


0

Bunu yapmanın en kolay yolunu buldum, özellikle de tablo görünümünüzü sekme çubuğunun içine ekliyorsanız, önce bir görünüm eklemek ve sonra da bu görünümü içine tablo görünümünü eklemek . Bu, aradığınız en üst kenar boşluğu kılavuzlarını verir.

resim açıklamasını buraya girin


-1

tüm çözümleri görün: projem sadece xib kullanmak, bu yüzden storyboard ile çözüm benim için işe yaramadı. self.edgesForExtendedLayout = UIRectEdgeNone; gezinme çubuğu görünür durumdaysa kontrolör için çalışır. ancak görünümünüzde durum çubuğu varsa, bu çalışmaz. bu yüzden iki conditons birleştiriyorum.

- (void) viewDidLayoutSubviews {
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {
    CGRect bounds = self.view.bounds;
    if(self.navigationController == nil || self.navigationController.isNavigationBarHidden == YES){
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];
    }
    else{
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }
}

bu işe yardımcı olur.


-2

İOS 6'yı da desteklemeniz gerekiyorsa, koşullu olarak aşağıya taşımanız gerekir. Yani, iOS 7'de sadece 20 nokta aşağı taşımalısınız (frame manipülasyon veya otomatik düzen kullanarak) ve iOS 6'da yalnız bırakmalısınız. Bunu IB'de yapabileceğinize inanmıyorum, bu yüzden kodda yapmanız gerekecek.

DÜZENLE

Bunu aslında iOS6 / iOS7 deltalarını kullanarak IB'de yapabilirsiniz. İOS 7'deki konumunuzu ayarlayın, ardından iOS 6 için delta Y'yi -20 noktaya ayarlayın. Daha fazla bilgi için bu SO sorusuna bakın .


Çerçeveyi aşağı indirmek maalesef değişmez.
Nicholas Smith

Bu konuda ne işe yaramaz? Tablo görünümü aşağı inmiyor mu?
Scott Berrevoets

Evet, aynı pozisyonda kalıyor. Ben denedim self.view.frameve self.tableView.frame, viewWillAppearve viewDidLoad. Güvende olmak setContentNeedsDisplayiçin yeniden çizmeyi de zorladım.
Nicholas Smith

Otomatik düzen etkin mi?
Scott Berrevoets

Evet, otomatik düzenleme ve Storyboard.
Nicholas Smith
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.