UITableView rozpoczyna się od przesunięcia w systemie iOS 7

115

Przeciągnąłem zwykły UITableView Jane na UIViewController w iOS 7.

Teraz istnieje pionowe przesunięcie odstępu przed rozpoczęciem pierwszej komórki. Jak się go pozbyć? Chcę, aby pierwsza linia znajdowała się znacznie bliżej górnej krawędzi miejsca, w którym faktycznie zaczyna się UITableView. Nie prosiłem o duży offset, prawda?

wprowadź opis obrazu tutaj

Jakieś pomysły?

user798719
źródło
43
Pomogły mi: YouStoryboard.storyboard> YouViewController> Inspektor atrybutów> Odznacz - Dostosuj wstawki widoku przewijania.
Alexander
17
btw, możesz zrobić zrzut ekranu symulatora iOS za pomocą klawisza Command + S
Hemang
@Alexander: Pomogły mi również wasze sugestie, jednak odznaczenie ExtendEdges.UnderTopBars spowodowało ponowne pojawienie się pionowego przesunięcia. Nie jestem pewien, czy to jeden z (wielu?) Błędów w Xcode6, ale te problemy od czasu do czasu przyprawiają mnie o ból głowy!
iOS-Coder

Odpowiedzi:

81

Domyślnie kontrolery widoku tabeli umieszczają zawartość pod paskiem nawigacyjnym, dzięki czemu można przewijać zawartość pod nią i wyświetlać ją w stanie rozmazanym pod paskiem nawigacyjnym / paskiem narzędzi.

Wygląda na to, że ustawiasz go na 44 (może 64) pikselach, aby usunąć go spod paska nawigacji, ale już to kompensuje, więc masz dużą lukę.

Przejdź do storyboard / xib w IB i odznacz zawartość pokazu w pasku nawigacji.

Cocoadelica
źródło
6
Przepraszamy, dlaczego komentarz dotyczący umowy o zachowaniu poufności na iOS7 jest nieistotny? To jest forum pomagające ludziom.
Cocoadelica
W Xcode w wersji 5.1 na Viewcontroller odznacz rozszerzone krawędzie> Pod górnymi paskami, aby usunąć górną wstawkę zawartości UITableView
Emel Elias
3
Więc gdzie jest zawartość pokazu pod nav bar thigo? Nie mogę tego znaleźć.
Anup Kattel
10
@FrankGorman w Xcode 5.1.1 jest opcja w scenorysie dla określonego kontrolera widoku Adjust Scroll View insets, usuń zaznaczenie.
korat prashant
1
hej @koratprashant. bardzo przydatny komentarz.
KDeogharkar
107

Nowa implementacja UIViewController w systemie iOS 7 ma nowy zestaw opcji, który pozwala deweloperowi wybrać, czy system automatycznie doda wstawki dla UIScrollView , UITableView i wyprowadzeń.

Aby wyłączyć to zachowanie, odznacz te pola dla wszystkich poszukiwanych UIViewControllers w InterfaceBuilder, na wybranym inspektorze obiektów UIViewController :

Wyświetl Inspektor kontrolerów

Po więcej szczegółów:

  1. Prześlij swoje aplikacje na iOS 7 już dziś.
  2. Przewodnik po przejściu do interfejsu użytkownika w iOS 7> Wygląd i zachowanie
xudre
źródło
Dzięki! Uratowałeś mnie.
rsc
68

Z przewodnika przejścia na iOS7:

Jeśli nie chcesz, aby wstawki zawartości widoku przewijania były automatycznie dostosowywane, ustaw automaticAdjustsScrollViewInsets na NO. (Wartość domyślna automaticAdjustsScrollViewInsets to TAK).

   self.automaticallyAdjustsScrollViewInsets = NO;
sovanlandy
źródło
9
Można to również ustawić w XCode w inspektorze atrybutów. Usuń zaznaczenie Adjust Scroll View Insetspola wyboru dla układu kontrolera widoku.
Andrew,
1
Jeśli ładujesz UIViewController programowo (bez użycia XIB), ten działa jak urok. Ustaw automaticallyAdjustsScrollViewInsets = NOw kontrolerze widoku.
KabraBoja,
To było to dla mnie. Mylące, ponieważ mój TableView znajdował się w widoku kontenera i początkowo wyglądał dobrze. Ale zostało schrzanione, kiedy wyskoczyło z innego kontrolera widoku.
n13
Wspaniały! Oszczędź mi dużo czasu!
inix
34

miałem podobny problem, po odrzuceniu viewController, contentOffset z mojego tableView został zmieniony na (0, -64).

moje rozwiązanie było trochę dziwne, wypróbowałem wszystkie inne odpowiedzi, ale bez powodzenia, jedyną rzeczą, która rozwiązała mój problem, była zmiana pozycji tableView w drzewie kontrolek .xib

była to pierwsza kontrolka w widoku nadrzędnym w następujący sposób:

przed

Przeniosłem tableView zaraz po ImageView i zadziałało:

po

wydaje się, że ustawienie widoku tabeli na pierwszej pozycji powodowało problem, a przeniesienie widoku tabeli na inną pozycję rozwiązało problem.

PD Nie używam autoLayout ani scenorysów

mam nadzieję, że to może komuś pomóc!

Chuy47
źródło
Zauważyłem to samo! Nie umieszczam żadnych dodatkowych widoków, ale po prostu kompensuję lukę przesuwając górę UITableView -44. Wydaje się, że w IB muszę przenieść -64px, ale w runtime -64px powoduje nakładkę tablview na pasek nawigacji i -44px jest OK. Nie potrafię tego wyjaśnić. Znalazłem ten problem w widoku popover na iPadzie, kiedy nie zauważyłem podobnego problemu w serii ujęć iPhone'a.
Mike Keskinov
Ten problem pojawia się nawet przy uiview. jeśli widok wyświetlany w interfejsie użytkownika nie jest ustawiony w tej samej kolejności.
Rinku
2
Miałem dzisiaj ten sam problem z XCode 6.1. Zmarnuj kolejne 2-3 godziny, próbując obejść błędy Apple ...
Mike Gledhill,
3
Było to niezwykle pomocne i zasługuje na więcej uwagi! Żadna ilość majstrowania przy ustawieniach kontrolera widoku lub wstawianiu / przesunięciu zawartości nie pomogła, ale zmiana kolejności widoków w scenorysie rozwiązała problem.
Caleb
1
Apple, mam na myśli ... WTF? Dzięki stary, to również naprawiono scenorys z automatycznym układem.
Borzh
30

rozwiązuje mój podobny problem:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}
Alex
źródło
1
W ten sposób powinieneś sprawdzić wersję systemu:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes
To zadziałało dla mnie w przypadku problemu z odstępami, który miałem, ale teraz mój spinner kontrolny pull-to-refresh jest częściowo zasłonięty i pod moim górnym menu. Czy ktoś to też widział? Jakieś obejścia?
Nick
@ nickv2002 spróbuj programowo utworzyć tableView
Alex
Wypróbowałem wszystkie inne rozwiązania, ale tylko ten działał dla mnie
DanielR
13

Spróbuj tego użyć

tableView.separatorInset = UIEdgeInsetsZero;

Oczywiście, jeśli obsługujesz coś mniejszego niż iOS7, musisz upewnić się, że obiekt odpowiada na ten selektor przed wywołaniem go.

David Attaie
źródło
4
nie jestem pewien, dlaczego głosowanie w tej sprawie jest podwyższane ... separatorInset zmienia tylko odległość między komórkami, która jest wstawiana od krawędzi widoku. Pytanie dotyczy przestrzeni nad i pod komórkami
Rembrandt Q. Einstein
Obraz jest mylący, ale typowe wyszukiwanie w Google dotyczące problemu z marginesami powoduje wyświetlenie tej strony.
Będzie
9

Poważnie, zmiana contentOffsetnie jest rozwiązaniem. Po prostu naprawiasz problem i nie naprawiasz jego przyczyny. Miałem do czynienia z tym samym problemem i okazuje się, że zgrupowane obrazy tableViews mają wypełnienie na górze. W moim przypadku ustawienie typu na zwykły załatwiło .

Miejmy nadzieję, że zaoszczędzi to komuś kilku minut. Z.

Zoltán
źródło
1
Tęskniłem za tym całkowicie, cieszę się, że znalazłem twoją odpowiedź, UPVOTE
AamirR
8

W iOS 9 żadna z innych odpowiedzi z tej strony nie działała dla mnie (tj. Odznaczanie pól w Storyboard, ustawienie automaticallyAdjustsScrollViewInsetsnaNO ).

Moje obejście, z którego jestem naprawdę niezadowolony, było następujące:

- (void)viewDidAppear:(BOOL)animated {
    self.tableView.contentOffset = CGPointMake(0.0, 0.0);
    self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}

Te same wiersze viewWillAppearlub viewDidLoadbyły nieskuteczne.

Brudny Henry
źródło
To powinna być jedyna odpowiedź dla uitableviewcontroller iOS 9 ... naprawdę, nic innego nie pomogło, a wypróbowałem je wszystkie, gdzie to znalazłeś lub jak to odkryłeś? wiele 10x
Erez
Odznaczenie Adjust Scroll View insetspola wyboru działa na iOS 9.
Adam
Dostosuj wstawki Scroll View nie działają dla mnie inne rozwiązanie?
Yogesh Patel
5

Czasami pojawia się 64odstęp wysokości u góry mojego widoku tabeli, gdy UIViewControllerjest osadzony w kontrolerze nawigacji.

wprowadź opis obrazu tutaj

W przeszłości po prostu odtwarzałem wszystko, mając nadzieję, że ograniczenia okażą się poprawne po wyczyszczeniu karty.

TIL: Jeśli nie chcesz tworzyć ograniczenia pionowego do Top Layout Guide, możesz przytrzymać Optionklawisz, aby uzyskać dostęp do Container Margin.

wprowadź opis obrazu tutaj

Następnie upewnij się, że Top Space to Superviewstała jest ustawiona na 0. To zadziałało przynajmniej dla mnie.

wprowadź opis obrazu tutaj

Robert Chen
źródło
1,5 roku później, ale to rozwiązało mój wieczór. Dzięki!
asp_net
4

To działa dla mnie:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
yeahdixon
źródło
2

Jeśli dodasz pusty UIView przed UITableView (lub dowolny widok jest przewijalny, taki jak ScrollView i TextView), możesz mieć szczęście.

Rolka
źródło
1

Miałem UITableViewController osadzony w widoku kontenera. Aby pozbyć się niechcianych 64 punktów pionowej przestrzeni, musiałem odznaczyć `` Dostosuj wstawki widoku przewijania '' w Interface Builder i ustawić contentInset UITableView w widokuWillAppear mojego UITableViewControllera, jak poniżej.

Rozmiar pionowej przestrzeni wydaje się pasować do wysokości ramki paska nawigacji i przesunięcia y. Problem wystąpił tylko na iOS 7.

- (void)viewWillAppear:(BOOL)animated;
{
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        const CGRect navBarFrame = self.navigationController.navigationBar.frame;
        const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
        self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
    }
}
user2067021
źródło
1

W Xamarin iOS ten problem występował na tle UITableViewController tuż po odrzuceniu modalnego okna dialogowego pierwszego planu. W trakcie przechodzenia na pierwszy plan UITableViewController miał ustawione wstawki (gdzieś przez iOS):

Ta klasa rozwiązała to

public class UITableViewControllerWithBugFix : UITableViewController {
    public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
    }

    public override void ViewWillLayoutSubviews() {
        if (TableView.ContentInset.Top != 0.0f)
            TableView.ContentInset = UIEdgeInsets.Zero;
        if (TableView.ScrollIndicatorInsets.Top != 0.0f)
            TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;

        base.ViewWillLayoutSubviews();
    }
}
Herman Schoenfeld
źródło
1

Od czasu do czasu wracam do tej okropnej sytuacji i zauważam, że wciąż jest ona dość nieznana. Więc dla przyszłej pamięci ...

Ostatnio naprawiam to obejście.

  1. Dodaj widok podrzędny u góry UITableView z zerową wysokością piksela. Działa z Autolayout lub bez.
  2. Jeśli czuję się pewnie :-) usuwam ten fałszywy widok, naprawiam ograniczenia na górze i magicznie działa.

Nie pytaj mnie dlaczego, nadal uważam, że to błąd głęboko w UIKit.

klauslanza
źródło
0

Jeśli przejdziesz do scenorysu, możesz zmienić przesunięcie, wybierając tabelę, a w sekcji Widok tabeli w Inspektorze atrybutów po prostu zmieniasz wstawki separatora po lewej stronie na 0.

Nyctitropist
źródło
0

Myślę, że prawdziwym rozwiązaniem jest ustawienie górnych i dolnych ograniczeń w widoku tabeli, tak aby były równe górnym i dolnym marginesom. Nie jest to górna prowadnica ani dolna prowadnica. Pozwala to na zachowanie wartości true dla funkcji AutomaticAdjustsScrollViewInsets.

Dan
źródło
0

Rozwiązanie Swift 3:

class PaddingLessTableView : UITableView
{
    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}
hhamm
źródło
0

Jeśli osadzony swoją TableViewController w NavigationController lub ContainerView, You have to constraint to margins instead of top Layout guide in Storyboard. Check constraint to margins when you are doing the constraintsŻaden inny sposób nie zadziałał dla mnie. Nie mogłem komentować, więc tylko powtarzam odpowiedź Roberta Chensa.

user3296487
źródło
0

Wypróbowałem kilka odpowiedzi. Zmiana ustawień w scenorysie spowodowała problemy z falowaniem w menu nakładki, które pojawia się z lewej strony.

Mam tylko pusty kontroler UIViewController w scenorysie, w przeciwnym razie wszystko jest generowane programowo.

Mam ten sam problem z UITableView wewnątrz UIView wewnątrz UIViewController. Mianowicie nagłówki sekcji zaczynają się zbyt nisko, gdy UIViewController jest osadzony w kontrolerze nawigacji. Bez kontrolera nawigacji wszystko działa dobrze.

Aby rozwiązać problem, utworzyłem UILabel i z ograniczeniami umieściłem dolne ograniczenie UILabel = górne ograniczenie UIView (więc nie jest wyświetlane na ekranie. Teraz z tą dodatkową kontrolką (nową etykietą) TableView zachowuje się poprawnie.

    inputsContainerView.addSubview(titleLabel)
    inputsContainerView.addSubview(tableView)

    // inputsContainerView
    ///////////////////////////////////////
    inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
    inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true

    // tableView
    ///////////////////////////////////////
    tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true

    // titleLabel - inserted to stop bad section header behavior
    ///////////////////////////////////////
    titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
Jan
źródło
0

Miałem ten sam problem w iOS 11 i xib, UITableviewController i rozwiązałem go jak poniżej

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
dobiho
źródło