iOS 7: UITableView pokazuje pod paskiem stanu


219

Pierwszy ekran mojej aplikacji jest UITableViewControllerbez paska nawigacyjnego, co oznacza, że ​​zawartość przepływa pod paskiem stanu, więc występuje wiele kolizji tekstu. Mam regulować zarówno właściwości Under top barsi Adjust scroll view insetsktóry faktycznie zatrzymać przewijanie mocy, ale kosztem utrzymania w górnej części tabeli w widoku. Próbowałem ustawić UITableViewprzesunięcie ramki o 20 pikseli, ale nie wydaje się to działać, a ponieważ obecnie potrzebuję aplikacji do zgodności z iOS 6, nie mogę przejść do Storyboardów iOS 7, aby wymusić użycie autolayout górna prowadnica wysokości. Czy ktoś znalazł rozwiązanie, które działa dla obu wersji?

Rzeczy, których próbowałem: ustawienie edgesForExtendedLayout, zmiana ustawień w Storyboard dla Under top barsi Adjust scroll view, zmuszanie ramki do nowego obszaru.

Obraz jest wart tysiąca słów: Przepływ paska stanu poniżej


2
Szybkim obejściem może być dodanie pustego 20-pikselowego nagłówka do tabeli podczas pracy na iOS 7.
EricS

@EricS: Mam tam już UITableViewnagłówek, również płynie pod paskiem stanu.
Nicholas Smith

Dlaczego nie skorzystać z przewodnika automatycznego układu na iOS 6? To działa.
Steven Fisher,

Odpowiedzi:


366

Dla każdego, kto chce to powielić, wykonaj następujące kroki:

  1. Utwórz nowy projekt iOS
  2. Otwórz główną scenorys i usuń domyślną / początkową UIViewController
  3. Przeciągnij nowy UITableViewControllerz biblioteki obiektów
  4. Ustaw jako początkowy kontroler widoku
  5. Wprowadź do tabeli dane testowe

Jeśli wykonasz powyższe kroki, po uruchomieniu aplikacji zobaczysz, że nic, w tym dostosowanie pól wyboru Xcode do „Rozszerz krawędzie pod słupkami {Góra, Dół, Nieprzezroczyste}”, nie powoduje zatrzymania pierwszego rzędu pod paskiem stanu, nie możesz też rozwiązać tego programowo.

Np. W powyższym scenariuszu następujące działania nie przyniosą efektu:

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

Ten problem może być bardzo frustrujący i uważam, że jest to błąd po stronie Apple'a, zwłaszcza, że ​​pojawia się we własnym okablowaniu UITableViewControllerz biblioteki obiektów.

Nie zgadzam się ze wszystkimi, którzy próbują rozwiązać ten problem, używając dowolnej formy „magicznych liczb”, np. „Użyj delty 20px”. Ten rodzaj ściśle powiązanego programowania zdecydowanie nie jest tym, czego chce od nas Apple.

Odkryłem dwa rozwiązania tego problemu:

  • Zachowanie UITableViewControllersceny :
    Jeśli chcesz zachować UITableViewControllerscenorys bez ręcznego umieszczania go w innym widoku, możesz osadzić UITableViewControllerw UINavigationController(Edytor> Osadź w> Kontroler nawigacji) i odznaczyć „Pokazuje pasek nawigacji” w inspektorze . To rozwiązuje problem bez konieczności dodatkowego dostosowywania, a także zachowuje UITableViewControllerscenę w scenorysie.

  • Korzystanie z funkcji AutoLayout i osadzanie jej UITableVieww innym widoku (uważam, że tak właśnie Apple chce, abyśmy to zrobili) :
    Utwórz puste pole UIViewControlleri przeciągnij UITableViewje. Następnie przeciągnij z wciśniętym klawiszem Ctrl w UITableViewkierunku paska stanu. Gdy mysz znajdzie się na dole paska stanu, zobaczysz dymek z autoukładem z napisem „Przewodnik po górnym układzie”. Zwolnij mysz i wybierz „Odstępy pionowe”. Dzięki temu system układu umieści go bezpośrednio pod paskiem stanu.

Przetestowałem oba sposoby na pustej aplikacji i oba działają. Konieczne może być dodatkowe ulepszenie, aby działały w Twoim projekcie.


5
Do Twojej wiadomości, opcja 1 (osadzenie w kontrolerze nawigacyjnym) powoduje, że komórki są widoczne za półprzezroczystym paskiem stanu podczas przewijania tabeli.
RyanR

4
@RyanR Też to zauważyłem, ale myślę, że w pewnym momencie jest OK. Apple zrobił to samo w widoku otwartych kart mobilnego Safari, zakładki będą wyświetlane pod paskiem stanu. Rozwiązanie kontrolera nawigacyjnego jest najprostszym obejściem, którego używam. Jednak półprzezroczysty pasek stanu to głupi pomysł.
Pride Chung,

6
Kiedy wykonuję przeciągnięcie z widoku tabeli w górę, nigdy nie wpadam na pasek stanu. W widoku nie ma widocznego paska stanu, nie jestem pewien, co masz na myśli ...
Jesse

4
Opcja 2 nie działa już w Xcode 5. Opisana akcja (przeciągnij z wciśniętym klawiszem Ctrl) nigdy nie powinna była działać, ponieważ jest ona własnością systemu Outlets, ale nawet jeśli ręcznie przeciągniesz do drzewa scen po lewej, górny przewodnik po układzie NIE DZIAŁA (powinno, AFAICT - uważam, że to kolejny poważny błąd w AutoLayout :( :()
Adam

3
@PrideChung wygląda głupio, gdy używasz nagłówka z widokiem tabeli, nagłówek pozostaje nieruchomy u góry, a elementy znikną za - i pojawią się ponownie za przezroczystym paskiem stanu ...
Ixx

86

Jeśli robisz rzeczy programowo i używasz opcji UITableViewControllerbez UINavigationControllerzakładu, najlepszym rozwiązaniem jest wykonanie następujących czynności viewDidLoad:

Szybki 3

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

Wcześniej Swift

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

UITableViewControllerNadal będą przewijać za pasku stanu, ale nie będzie się pod nim, gdy przewijane w górę.


1
Możesz dodać sprawdzanie wersji systemu operacyjnego> 7 i obsługiwać również starsze systemy operacyjne (bez wstawek dla tych). W przeciwnym razie działało to dobrze dla moich celów.
SimpsOff

8
Wartość wysokości zakodowania na stałe nie jest najlepszym pomysłem.
Maciej Kozieł,

3
Tak, topLayoutGuidezamiast tego użyj długości.
lipka

10
Chciałbym użyć UIApplication.sharedApplication.statusBarFrame.size.heightzamiast 20.
mojuba

Zostało to zaktualizowane do UIApplication.shared.statusBarFrame.size.height w tych dniach.
asetniop

23

Uwaga: działało to dla mnie dla następującej konfiguracji:

  • Brak paska nawigacyjnego u góry ekranu (widok tabeli spełnia pasek stanu)
  • Widok tabeli nie jest przewijany

Jeśli powyższe dwa warunki nie zostaną spełnione, przebieg może się różnić.

Oryginalny post

Stworzyłem mój widok programowo, co skończyło się dla mnie:

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

Źródło (w sekcji topLayoutGuide na dole str.39).


Ciekawe ... Mogłem to tak nazwać w moim projekcie bez problemu ... Mogę mieć prostszą strukturę układu widoku niż ty. Twoja sugestia jest poprawna, dokonam tej zmiany w mojej odpowiedzi.
Stunner

Podczas obracania aplikacji natknąłem się na problem. Gdybyś miał wyłączoną rotację, prawdopodobnie nie miałbyś problemu.
Jeremy

W moim projekcie nie mam włączonej rotacji i natknąłem się na problem, ale tak, nadal jest to dobra uwaga.
Stunner

1
Dla każdego, kto wdraża swój własny kontroler kontenerów, jest to poprawny sposób dostosowania statusu lub paska nawigacyjnego pod pokrywą!
Rafael Nobre

Jeśli zmienisz początek, ale nie wysokość granic widoku, czy dno nie zostanie obcięte przez dolną krawędź ekranu o kwotę, którą zmieniłeś początek? (więc nie można zobaczyć ostatnich kilku rzędów pikseli)
Tenfour04,

20

Dodanie do najwyższej odpowiedzi:

po tym, jak druga metoda początkowo nie działała, zrobiłem dodatkowe majsterkowanie i znalazłem rozwiązanie.

TLDR; drugie rozwiązanie z pierwszej odpowiedzi prawie działa, ale w przypadku niektórych wersji xCode ctrl + przeciągnięcie do „Przewodnika po górnym układzie” i wybranie Odstępu pionowego nic nie robi. Jednak najpierw dostosowując rozmiar widoku tabeli, a następnie wybierając „Przewodnik od górnego odstępu do górnego układu”


  1. Przeciągnij pusty ViewController na storyboard. Zobacz kontroler

  2. Przeciągnij obiekt UITableView do widoku. (Not UITableViewController). Umieść go w samym środku za pomocą niebieskich prowadnic układu.

Widok tabeli Centrum obrazu

  1. Przeciągnij UITableViewCell do TableView. To będzie twoja komórka do ponownego użycia prototypu, więc nie zapomnij ustawić jej identyfikatora ponownego użycia w zakładce Atrybuty, w przeciwnym razie nastąpi awaria.

Dodaj komórkę widoku tabeli Ponownie użyj identyfikatora

  1. Utwórz własną podklasę UIViewController i dodaj <UITableViewDataSource, UITableViewDelegate>protokoły. Nie zapomnij ustawić ViewController twojego scenariusza na tę klasę w Inspektorze tożsamości.

  2. Utwórz ujście dla TableView w pliku implementacji i nazwij go „tableView”

Utwórz Outlet tableView

  1. Kliknij prawym przyciskiem myszy TableView i przeciągnij zarówno źródło danych, jak i delegata do ViewController.

delegat dataSource

Teraz część nie przycinania na pasku stanu.

  1. Chwyć górną krawędź widoku tabeli i przesuń go w dół do jednego z przerywanych niebieskich prowadnic automatycznego układania, które znajdują się u góry

Zmień rozmiar

  1. Teraz możesz kontrolować przeciąganie z widoku tabeli na górę i wybrać opcję Odstęp górny do górnego układu

Przewodnik od górnej przestrzeni do górnej

  1. To da ci błąd dotyczący niejednoznacznego układu TableView, po prostu dodaj brakujące ograniczenia i gotowe.

Dodaj brakujące ograniczenia

Teraz możesz ustawić widok swojego stołu tak, jak zwykle, i nie przycina on paska stanu!


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
przełącz <= na> i usuń pusty blok if
pfrank

1
Czytanie self.topLayoutGuide.lengthz viewDidLayoutSubviewszepsuje układ widoków podrzędnych.

@OLzh, robiąc to tak, jak opisano, self.tableView nie może przewijać.
DawnSong,

8

Wybierz UIViewController na swojej serii ujęć i odznacz opcję Wydłuż krawędzie pod górnymi pasami. Pracował dla mnie. :)


Niestety, nie działało dla mnie. Całkowicie domyślny moduł UITableViewController nadal nakłada się na pasek stanu. Nie sądzę, że pasek stanu liczy się jako pasek górny. Po prostu paski nawigacji i paski kart.
Andrew Duncan,

Jedyne rozwiązanie, które działa dla mnie, ty. (Uwaga: musisz „skrócić” widok tabeli pod paskiem stanu w IB i zaktualizować ograniczenia).
Martin Makarsky

Pracowałem dla mnie na Xcode 8 z UITableViewController.
Edouard Barbier,

8

Oto jak napisać to w „Swift”. Dostosowanie do odpowiedzi @ lipki:

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

Czy nie jest tu dozwolone szybkie?
uplearnedu.com

Jedyne rozwiązanie, które zadziałało dla mnie, nie zmuszając mnie do utworzenia
kontrolera

1
Jest to mniej niż idealne, ponieważ utrzymuje górną wstawkę na 20, nawet w krajobrazie, w którym nie ma domyślnego paska stanu w ios8
voidref

Ta odmiana dobrze sobie radzi z każdą konfiguracją:- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
qix

5

W przypadku Xcode 7 odznaczenie „półprzezroczystego” znacznika wyboru paska nawigacji działało dla mnie.

wprowadź opis zdjęcia tutaj


Najprostszy, najszybszy, najłatwiejszy, najbezpieczniejszy? rozwiązanie. Nie wiem, dlaczego ma to tak niewiele pozytywnych opinii w porównaniu do wszystkiego innego.
Gruntcakes

3

To naprawi to dla UITableViewController (bez żadnych magicznych liczb). Jedyną rzeczą, której nie udało mi się naprawić, jest rozmowa telefoniczna, w którym to przypadku blat stołu jest zbyt mocno przesunięty w dół. Jeśli ktoś wie, jak to rozwiązać, daj nam znać.

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

Nie wiem, jak to koszerne, ale odkryłem, że ten schemat przesuwa widok ViewController w dół i zapewnia pasek stanu z solidnym tłem:

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

Oczywiście zamień na redColordowolny kolor tła.

Musisz osobno wykonać jeden ze swizzli, aby ustawić kolor znaków / symboli na pasku stanu. Używam View controller-based status bar appearance = NOiw Status bar style = Opaque black styleplist, aby zrobić to globalnie.

Wydaje się, że działa i chciałbym usłyszeć o wszelkich błędach lub problemach z tym związanych.


2

Odpowiedź chappjc działa świetnie podczas pracy z XIB.

Znalazłem najczystsze rozwiązanie, gdy programowo tworzę TableViewControllers, owijając instancję UITableViewController w inny UIViewController i odpowiednio ustawiając ograniczenia.

Oto on:

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

Pozdrawiam, Ben


1

Myślę, że podejście do korzystania z UITableViewController może nieco różnić się od tego, co robiłeś wcześniej. To zadziałało dla mnie, ale możesz nie być jego fanem. To, co zrobiłem, to kontroler widoku z widokiem kontenera, który wskazuje mój UItableViewController. W ten sposób mogę korzystać z TopLayoutGuide dostarczonego do mojej scenorysu. Po prostu dodaj ograniczenie do widoku kontenera i powinieneś zadbać o system iOS7 i iOS6.


1

Skończyło się na jednym dodatkowym widoku z pożądanym tłem, dodanym po TableView i umieszczonym pod paskiem stanu:

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

To nie jest bardzo ładne, ale jest to dość proste rozwiązanie, jeśli potrzebujesz pracy z widokami bez Xib, i zarówno IOS6, jak i IOS7


1

Zrobiłem to dla wyświetlania Retina / Non-Retina jako

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

Poniższe rozwiązanie działa wystarczająco dobrze w kodzie bez użycia stałych magicznych i odpowiada za zmianę klasy rozmiaru przez użytkownika, np. Poprzez obracanie lub równoległe aplikacje na iPadzie:

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

Działa dla szybkiego 3 - In viewDidLoad ();

let statusBarHeight = UIApplication.shared.statusBarFrame.height

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

Ten kod: 1. Pobiera wysokość paska stanu 2. Daje górnej części tabeli wstawkę zawartości równą wysokości paska stanu. 3. Nadaje wskaźnikowi przewijania tę samą wstawkę, dzięki czemu pojawia się pod paskiem stanu.


1

Dla takich jak ja, którzy woleliby nie osadzać ich UITableViewControllerw UIViewControllertym, spróbuj:

Niestandardowa UITableViewControllerpodklasa może dołączyć widok maski do podglądu tableView. Dodaj maskę w viewDidAppear i usuń maskę w viewWillDisappear.

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

Miałem UISearchBar na górze mojego UITableView i następujące działały;

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

Udostępnij i ciesz się ...



0

Rozwiązanie Abrahamchez https://developer.apple.com/library/ios/qa/qa1797/_index.html działało dla mnie w następujący sposób. Jako swój początkowy widok miałem jednego kontrolera UITableview. Próbowałem kodu przesunięcia i osadzenia w navcon, ale żadne z nich nie rozwiązało przezroczystości paska stanu.

Dodaj kontroler widoku i ustaw go jako widok początkowy. Powinno to pokazać najważniejsze wskazówki dotyczące górnego i dolnego układu.

Przeciągnij stary widok tabeli do widoku w nowym kontrolerze.

Wykonaj wszystkie czynności, aby zmodernizować tabelę do nowego kontrolera:

Zmień stary plik kontrolera widoku na dziedziczenie / podklasę z UIViewController zamiast UITableViewController.

Dodaj UITableViewDataSource i UITableViewDelegate do .h kontrolera widoku.

Podłącz ponownie wszystko, co potrzebne w scenorysie, takie jak pasek wyszukiwania.

Najważniejsze jest, aby skonfigurować ograniczenia, jak w Apple Q&A. Nie zawracałem sobie głowy wstawieniem paska narzędzi. Nie jestem pewien dokładnej sekwencji. Ale czerwona ikona pojawiła się w przewodnikach po układach, być może kiedy budowałem. Kliknąłem go i pozwoliłem Xcode zainstalować / wyczyścić ograniczenia.

Potem klikałem wszędzie, aż znalazłem ograniczenie Przestrzeń pionowa i zmieniłem jego najwyższą wartość z -20 na 0 i działało idealnie.


0

Używam UISplitViewController z kontrolerem nawigacyjnym i kontrolerem widoku tabeli. Działa to dla mnie w widoku głównym po wypróbowaniu wielu rozwiązań tutaj:

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

Jest podobny do rozwiązania Hot Licks, ale stosuje widok podrzędny do navigationController.


To jedyna odpowiedź, która zadziałała dla mnie w iOS 8!
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

Oto Swift 2.3. (Xcode 8.0) rozwiązanie. Utworzyłem podklasę UITableView.

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

Wstawka zawartości powinna zawsze być zerowa (domyślnie). Ustawiam go ręcznie na zero. Możesz również dodać metodę czeku, która sprawia, że ​​czek i jeśli jest to coś innego niż chcesz, to po prostu otrzymaj poprawną odpowiedź. Zmiana zostanie odzwierciedlona tylko po narysowaniu widoku tabeli (co nie zdarza się często).

Nie zapomnij zaktualizować TableView w swoim IB (w TableViewController lub po prostu TableView w twoim ViewController).


0

Napotkałem ten problem w systemie iOS 11, ale układ był poprawny dla systemu iOS 8 - 10.3.3. W moim przypadku ustawiłem ograniczenie przestrzeni pionowej na Superview.Top Margin zamiast Superview.Top, który działa na iOS 8-11.

wprowadź opis zdjęcia tutaj


0

Znalazłem najłatwiejszy sposób, aby to zrobić, zwłaszcza jeśli dodajesz widok tabeli wewnątrz paska kart, to najpierw dodaj widok, a następnie dodaj widok tabeli w tym widoku . Daje to najlepsze przewodniki po marginesach, których szukasz.

wprowadź opis zdjęcia tutaj


-1

zobacz wszystkie rozwiązania: mój projekt to po prostu xib, więc rozwiązanie z storyboardem nie działało dla mnie. self.edgesForExtendedLayout = UIRectEdgeNone; działa tylko dla kontrolera, jeśli widoczny jest pasek nawigacyjny. ale jeśli twój widok ma tylko pasek stanu, to nie zadziała. więc łączę dwa warunki.

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

pomóż to działa.


-2

Jeśli potrzebujesz również obsługiwać iOS 6, musisz go warunkowo przenieść w dół. Oznacza to, że w iOS 7 powinieneś po prostu przesunąć go o 20 punktów w dół (albo poprzez framemanipulację lub za pomocą automatycznego układu), a w iOS 6 pozostawiasz go w spokoju. Nie wierzę, że możesz to zrobić w IB, więc musisz to zrobić w kodzie.

EDYTOWAĆ

Możesz to zrobić w IB, używając delt iOS6 / iOS7. Ustaw swoją pozycję w iOS 7, a następnie w iOS 6 ustaw różnicę Y na -20 punktów. Zobacz to SO pytanie, aby uzyskać więcej informacji.


Ustawienie ramki nie zmienia tego niestety.
Nicholas Smith

Co w tym nie działa? Widok tabeli nie przesuwa się w dół?
Scott Berrevoets,

Tak, pozostaje w tej samej pozycji. Próbowałem self.view.framei self.tableView.frame, w obu viewWillAppeari viewDidLoad. Dla bezpieczeństwa ustawiłem też setContentNeedsDisplaywymuszanie przerysowania.
Nicholas Smith

Czy włączony jest automatyczny układ?
Scott Berrevoets,

Tak, to autoukład i Storyboard.
Nicholas Smith
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.