ios - uitableviewcell - uitableview number of sections




Warum gibt es am oberen Rand von UITableView eine zusätzliche Auffüllung mit dem Style UITableViewStyleGrouped in iOS7 (20)

Ab iOS7 gibt es oben auf meinen UITableView einen zusätzlichen Speicherplatz, der einen Style UITableViewStyleGrouped .

Hier ist ein Beispiel:

Die Tabellenansicht beginnt mit dem ersten Pfeil, es gibt 35 Pixel ungeklärter Auffüllung, dann ist der grüne Header ein UIView von viewForHeaderInSection (wobei der Abschnitt 0 ist).

Kann mir jemand erklären, woher diese 35-Pixel-Menge kommt und wie ich sie loswerden kann, ohne zu UITableViewStylePlain wechseln zu UITableViewStylePlain ?


Also habe ich jede Methode hier versucht, und diesmal hat keiner von ihnen geholfen. Mein Fall war eine gruppierte Tabellenansicht auf iOS 9. Ich weiß nicht wirklich warum und wie ich das herausgefunden habe, aber für mich hat das Einstellen des tableViewHeader mit einer UIView mit mindestens 0.01 Höhe funktioniert. CGRectZero hat nicht geholfen, nichts half wirklich:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))

Danke an die Antwort von @Aurelien Porte. Hier ist meine Lösung

Ursache dieses Problems: -

  1. Ein UITableView möchte keine Kopfzeile mit einer Höhe von 0.0 haben. Wenn Sie versuchen, einen Header mit einer Höhe von 0 zu haben, können Sie zur Lösung springen.
  2. Auch wenn Sie später Ihrer Kopfzeile eine Höhe von nicht 0.0 zuweisen, möchte ein UITableView nicht zuerst eine Kopfzeile mit einer Höhe von 0.0 zugewiesen werden.

In ViewDidLoad: -

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

Keine Notwendigkeit für so etwas: -

self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)

Im heightForHeaderInSection Delegat: -

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

In viewForHeaderInSection Delegat: -

if section == 0 
{  
   // Note CGFloat.min for swift
   // For Objective-c CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Construct your other headers here 
}

Fügen Sie Ihrem viewDidLoad in Ihrem VC einfach Folgendes hinzu:

self.automaticallyAdjustsScrollViewInsets = NO;

Für IOS 7, wenn Sie eine Tabellenansicht in einem View-Controller zuweisen, können Sie sich das ansehen

self.edgesForExtendedLayout = UIRectEdgeNone;

Dein Problem schien mir ähnlich zu sein

Aktualisieren:

Schnell in iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Schnell 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)

Ich denke, UIEdInSenses -35 0 0 0 zu machen ist langweilig. In meinem Fall habe ich die Methode "tableView: heightForHeaderInSection:" implementiert und sie hat das Potenzial, 0 zurückzugeben.

Als ich 0 zu 0.1f änderte, ging das Problem einfach weg.


Ich gehe davon aus, dass dies nur ein Teil des neuen UITableViewStyleGrouped Stylings ist. Es ist in allen gruppierten Tabellenansichten und es scheint keinen direkten Weg zu geben, diesen Raum zu kontrollieren.

Wenn dieser Bereich durch eine UIView repräsentiert wird, ist es möglich, alle subviews von UITableView zu UITableView , um diese bestimmte Ansicht zu finden und direkt zu bearbeiten. Es gibt jedoch auch die Möglichkeit, dass dieser Bereich nur ein hartkodierter Offset ist, bevor Header und Zellen beginnen und es keine Möglichkeit gibt, ihn zu bearbeiten.

Um alle Untersichten zu durchsuchen (ich würde diesen Code ausführen, wenn die Tabelle keine Zellen enthält, um das Lesen der Ausgabe etwas einfacher zu machen):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}

Ich habe etwas mehr damit herumgespielt und es scheint, als wäre dies ein Nebeneffekt der Einstellung von tableHeaderView = nil der tableHeaderView = nil .

Weil meine TableView eine dynamisch erscheinende tableHeaderView , wenn ich die tableHeaderView ausblenden tableHeaderView , anstatt self.tableView.tableHeaderView = nil; , Ich mache:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

Ich mag diese Lösung besser, als ein etwas willkürliches contentInset.top weil ich auch contentInset.top dynamisch verwende. Ich contentInset.top daran denken, extra 35px zu entfernen, wenn ich contentInset.top neu contentInset.top .


Ich habe gerade UITableView vom Interface Builder , es wieder einmal erstellt und seltsames 35px weg gegangen.

Es scheint, dass es einen seltsamen Fehler im Interface Builder .


Ich hatte den gleichen Fehler wie Arielyz. Sobald ich das UITableView verschoben habe, um nicht die erste Unteransicht der Elternansicht zu sein, ging es weg. Mein Platz war 20 px, nicht 35.

Ich konnte es nicht in einem Portrait Xib, nur einem Landscape Xib neu erstellen. Ich werde später einen Radarbug einreichen, wenn ich ihn in einer einfachen Demo-App reproduzieren kann.


Ich wurde von folgenden geholfen:

YouStoryboard.storyboard> YouViewController> Attribute-Inspektor> Uncheck - Passen Sie die Bildlaufeinschübe an.


Meine Antwort wird allgemeinere Antwort sein, kann aber auch darauf angewendet werden.

Wenn die Stammansicht (des ViewControllers ) oder die erste untergeordnete Ansicht (Unteransicht) der Stammansicht eine Unterklasse von UIScrollView (oder UIScrollView selbst) ist und if

self.navigationController.navigationBar.translucent = YES;

Rahmen wird automatisch vorberechnet contentInset setzen .

Um dies zu vermeiden, können Sie tun

self.automaticallyAdjustsScrollViewInsets = NO;

aber in meinem Fall war ich nicht in der Lage, dies zu tun, weil ich SDK mit UIView-Komponente implementierte, die von anderen Entwicklern verwendet werden kann. Diese UIView-Komponente enthält UIWebView (mit UIScrollView als erster Unteransicht). Wenn diese Komponente als erstes untergeordnetes Element in der Ansichtshierarchie des UIViewControllers hinzugefügt wird, werden automatische Einfügungen vom System angewendet.

Ich habe dies behoben, indem ich Dummy-View mit Frame (0,0,0,0) hinzugefügt habe, bevor ich UIWebView hinzufüge.

In diesem Fall hat das System die Unterklasse von UIScrollView nicht als erste Untersicht gefunden und keine Einsätze angewendet


Noch ein kurzer Kommentar ... sogar in XCode 6.1 gibt es einen Fehler mit vertikalen Leerzeichen, die oben in UIScrollViews , UITextViews und UITableViews .

Manchmal besteht die einzige Möglichkeit, dieses Problem zu beheben, darin, in das Storyboard zu gehen und das Problemsteuerelement zu ziehen, damit es nicht länger die erste Unteransicht auf der Seite ist.

(Ich danke Oded, dass er mich in diese Richtung weist ... Ich poste diesen Kommentar, nur um ein paar Screenshots hinzuzufügen, um die Symptome zu demonstrieren und zu beheben.)


So kann es leicht in iOS 11 und Xcode 9.1 über Storyboard behoben werden:

Wählen Sie Tabellenansicht> Größeninspektor> Inhaltseinfügungen: Nie


Swift: iOS Ich hatte Tabellenansicht in der Bildlaufansicht .. als ich auf dem gleichen Bildschirm auf "Zurück" geklickt habe. Scroll-View nehmen mehr Platz an der Spitze .. um das zu lösen habe ich verwendet:

 self.automaticallyAdjustsScrollViewInsets = false

Ein boolescher Wert, der angibt, ob der Ansichtscontroller seine Bildlaufeinfügungen automatisch anpassen soll. Der Standardwert ist true, mit dem der Ansichtscontroller seine Bildlaufeinfügungen als Reaktion auf die von der Statusleiste, Navigationsleiste und Symbolleiste oder Registerleiste belegten Bildschirmbereiche anpassen kann. Setzen Sie den Wert auf "false", wenn Sie die Bildlaufversatzanpassungen selbst verwalten möchten, z. B. wenn in der Ansichtshierarchie mehrere Bildlaufansichten vorhanden sind.


Verwenden Sie diese Option, wenn Sie gruppierte TableView verwenden, um das Schneiden von Rahmen in viewWillAppear zu vermeiden

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);

Viele der obigen Antworten sind zu hackig. Sie würden jederzeit in der Zukunft brechen, wenn Apple beschließt, dieses unerwartete Verhalten zu beheben.

Wurzel des Problems:

  1. Ein UITableView keine Kopfzeile mit einer Höhe von 0.0 haben. Wenn Sie versuchen, einen Header mit einer Höhe von 0 zu haben, können Sie zur Lösung springen.

  2. Auch wenn Sie später Ihrer Kopfzeile eine Höhe von nicht 0.0 zuweisen, UITableView ein UITableView nicht zuerst eine Kopfzeile mit einer Höhe von 0.0 zugewiesen werden.

Lösung:

Die einfachste und zuverlässigste Lösung besteht dann darin, sicherzustellen, dass Ihre Kopfhöhe nicht 0 ist, wenn Sie sie der Tabellenansicht zuweisen.

So etwas würde funktionieren:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

So etwas würde zu einem bestimmten Zeitpunkt (normalerweise nach einem Scroll) zu dem Problem führen:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;

nutze diese, ich denke, diese Hilfe ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }

Dies ist die Lösung für iOS 10 mit Swift 3:

Sie können die oberen und unteren Paddings loswerden, indem Sie die folgenden Methoden aus dem UITableViewDelegate .

    func tableView( _ tableView: UITableView, heightForHeaderInSection section: Int ) -> CGFloat
    {
       return CGFloat.leastNormalMagnitude
    }

    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
    {
       return CGFloat.leastNormalMagnitude
    }

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

    return CGFLOAT_MIN;
}

Das war's Leute!


override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }




ios7