Gibt es eine Möglichkeit, UITableView-Zellen in iOS 7 ohne Zeilenumbruch im Trennzeichen zu versehen?

68

Ich habe festgestellt, dass UITableViewCells in iOS 7 einen Zeilenumbruch im Trennzeichen der Zelle haben, den iOS 6 nicht hat. Gibt es eine Möglichkeit, diesen Zeilenumbruch loszuwerden? Wenn Sie das Trennzeichen in "Keine" ändern und dann UIViews mit der Farbe des Trennzeichens erstellen, wird das weiße Trennzeichen trotzdem angezeigt.

Anthony Glyadchenko
quelle

Antworten:

116

Für iOS7:

if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [self.tableView setSeparatorInset:UIEdgeInsetsZero];
}

Für iOS8:

Konfigurieren Sie zuerst Ihre Tabellenansicht wie folgt:

if ([self.tableView respondsToSelector:@selector(layoutMargins)]) {
    self.tableView.layoutMargins = UIEdgeInsetsZero;
}

Konfigurieren Sie dann in Ihrer cellForRowAtIndexPath: -Methode die Zelle wie folgt:

if ([cell respondsToSelector:@selector(layoutMargins)]) {
    cell.layoutMargins = UIEdgeInsetsZero;
}

Hinweis: Schließen Sie sowohl layoutMargins als auch separatorInset ein , um beide iOS-Versionen zu unterstützen

Luis E. Prado
quelle
In welcher Methode soll ich diese Zeile schreiben? Funktioniert bei mir nicht
Kaptain
Fügen Sie dies in der ViewDidLoad-Methode hinzu. Es klappt. Sie können den Einschub auch ändern, wenn Sie Ihre Tabellenansichten iOS7ish machen möchten.
Bms270
2
ty für die Aktualisierung Ihrer Antwort
Jenson
1
Ich stellte fest, dass ich sowohl die oben angegebenen iOS7- als auch iOS8-Teile für iOS8 benötigte.
Chris Prince
5
Update: Die iOS 8 Fix funktioniert , wenn Sie setzen layoutMarginsin viewDidLayoutSubviews. Es funktioniert nicht, wenn Sie es viewDidLoadoder ähnliches einstellen . Ich habe die Antwort so bearbeitet, dass dies klar ist.
Chris Nolet
44

Sie können den ' Separator Inset ' auch über das Storyboard festlegen :

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Tarek Hallak
quelle
1
Für diejenigen, die eine UITableView in einem übergeordneten UIView- oder UIViewController-Element haben, wird das obige Bild nicht angezeigt, aber die "Separator Insets" werden auf "Default" gesetzt, wenn Sie die UITableView in Ihrer .xib überprüfen. Wählen Sie "Benutzerdefiniert" und ändern Sie links oder rechts auf 0. Mit anderen Worten, verschwenden Sie keine Zeit damit, all diese anderen Dinge auszuprobieren!
Stellen
2
Das klingt richtig, hat aber bei mir nicht funktioniert. Ich habe ein neues Projekt erstellt, einen TVC hineingezogen, ihn zum Root-VC gemacht und den linken Einschub auf 0 geändert. Ich habe den Simulator ausgeführt, und die Trennzeichen waren noch eingeschoben. Irgendeine Idee warum? Die Lösung von nobre (unten) funktioniert für mich.
mkc842
Vielen Dank! Du hast mir so viel Zeit gespart.
Ryan Walton
37

Wenn Sie ältere Versionen von iOS unterstützen möchten, sollten Sie die Verfügbarkeit dieser Methode überprüfen, bevor Sie sie aufrufen:

if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
Boro
quelle
Dies ist sicherer, wenn Sie nicht auch auf ios6 zielen
Yunus Nedim Mehel
Wie bekomme ich das in iOS6?
Thatzprem
16

Herausgefunden.

[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
Anthony Glyadchenko
quelle
1
Das hat auch bei mir funktioniert. Ich verstehe übrigens nicht, warum Separator diese Pausen hat. Und in meiner App in einer Tabellenansicht sind dieselben Trennlinien doppelt und andere einfach. Warum - keine Ahnung.
Valeriy Van
Es hat bei mir für die leere Tabellenansicht funktioniert. aber meine benutzerdefinierten wiederverwendbaren Zellseparatoren blieben als Taubheitsfall
Karan Alangat
9

Die ausgewählte Antwort hat bei mir nicht funktioniert. Aber das ja und es funktioniert ab ios 2.0:

   [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
anasaitali
quelle
2
Gut nur, wenn Sie überhaupt kein Trennzeichen wollen .
Chris Prince
Nein, das ist, wenn du überhaupt keinen Stil willst und das ist, was er will.
Anaasaitali
Das beantwortet die Frage nicht.
König-Zauberer
9

Schnelle Version

iOS führt die Eigenschaft layoutMargins für Zellen- UND Tabellenansichten ein.

Diese Eigenschaft ist in iOS 7.0 nicht verfügbar, daher müssen Sie sie überprüfen, bevor Sie sie zuweisen!

Apple hat Ihrer Zelle jedoch eine ** -Eigenschaft hinzugefügt, die verhindert, dass die Randeinstellungen Ihrer Tabellenansicht übernommen werden. Auf diese Weise können Ihre Zellen unabhängig von der Tabellenansicht ihre eigenen Ränder konfigurieren. Betrachten Sie es als Überschreibung.

Diese Eigenschaft heißt preservesSuperviewLayoutMargins , und es NO Einstellung ermöglicht es Ihnen , Ihre Tabellenansicht der layoutMargin Einstellung mit Ihrer eigenen Zelle layoutMargin Einstellung außer Kraft zu setzen. Beides spart Zeit ( Sie müssen die Einstellungen der Tabellenansicht nicht ändern ) und ist präziser. Eine ausführliche Erklärung finden Sie in der Antwort von Mike Abdullah.

HINWEIS: Dies ist die richtige, weniger chaotische Implementierung, wie in der Antwort von Mike Abdullah ausgedrückt. Durch Festlegen der Vorbehalte Ihrer ZelleSuperviewLayoutMargins = NO wird sichergestellt, dass Ihre Tabellenansicht die Zelleneinstellungen nicht überschreibt.

Erster Schritt - Richten Sie Ihre Zellränder ein:

/*
    Tells the delegate the table view is about to draw a cell for a particular row.
*/
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Remove seperator inset
    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }

    // Prevent the cell from inheriting the Table View's margin settings
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }

    // Explictly set your cell's layout margins
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
}

Wenn Sie die EigenschafterveSuperviewLayoutMargins für Ihre Zelle auf NO setzen, sollte verhindert werden, dass Ihre Tabellenansicht Ihre Zellenränder überschreibt. In einigen Fällen scheint es nicht richtig zu funktionieren.

Zweiter Schritt - Nur wenn alles fehlschlägt, können Sie Ihre Tabellenansichtsränder brutal erzwingen:

/*
    Called to notify the view controller that its view has just laid out its subviews.
*/
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Force your tableview margins (this may be a bad idea)
    if self.tableView.respondsToSelector("setSeparatorInset:") {
        self.tableView.separatorInset = UIEdgeInsetsZero
    }

    if self.tableView.respondsToSelector("setLayoutMargins:") {
        self.tableView.layoutMargins = UIEdgeInsetsZero
    }
}

... und los geht's! Dies sollte sowohl unter iOS 8 als auch unter iOS 7 funktionieren.

Hinweis: Getestet mit iOS 8.1 und 7.1, in meinem Fall musste ich nur den ersten Schritt dieser Erklärung verwenden.

Der zweite Schritt ist nur erforderlich, wenn Sie eine nicht ausgefüllte Zelle unter den gerenderten Zellen haben, d. H. wenn die Tabelle größer als die Anzahl der Zeilen im Tabellenmodell ist. Wenn der zweite Schritt nicht ausgeführt wird, führt dies zu unterschiedlichen Trennzeichenversätzen.

König-Zauberer
quelle
8

Rufen Sie für eine dauerhafte Lösung in der gesamten Anwendung dies in der Anwendung auf: didFinishLaunching. Jede Tabellenansicht wird "repariert".

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
  [[UITableView appearance]setSeparatorInset:UIEdgeInsetsZero];
}
Rafael Nobre
quelle
7

Und in iOS 8, basierend auf dem Beitrag von Seth McFarlane hier , müssen Sie sich mit layoutMargins befassen. Folgendes hat es für mich getan:

  1. Führen Sie in ApplicationDidFinishLaunching Folgendes aus:

    if ([UITableViewCell instancesRespondToSelector:@selector(setLayoutMargins:)]) {
        [[UITableViewCell appearance]setLayoutMargins:UIEdgeInsetsZero];
    }
    
  2. Erstellen Sie die folgende Kategorie in UITableView:

    @interface UITableView(WJAdditions)
    -(void) wjZeroSeparatorInset;
    @end
    
    @implementation UITableView (WJAdditions)
    -(void) wjZeroSeparatorInset {
    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
      if ([self respondsToSelector:@selector(setLayoutMargins:)]) {
        self.layoutMargins = UIEdgeInsetsZero;
      }
    #endif
    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
       if ([self respondsToSelector: @selector(setSeparatorInset:)])
          self.separatorInset = UIEdgeInsetsZero;
       }
    #endif
    }
    @end
    
  3. Rufen Sie in Ihren UITableViews kurz nach der Initialisierung auf

    [self wjZeroSeparatorInset];
    
  4. In Ihren UITableViewControllern benötigen Sie Folgendes:

    -(void) viewWillLayoutSubviews {
      [super viewWillLayoutSubviews];
      UITableView* tv = self.tableView;
      if ([tv respondsToSelector:@selector(setLayoutMargins:)]) {
        [tv setLayoutMargins:UIEdgeInsetsZero];
      }
    }
    
William Jockusch
quelle
6

In iOS 8 scheint es einen kleinen Fehler zu geben. Der benutzerdefinierte Wert für das Trennzeichen wird nicht auf die Zellen mit Text angewendet. Ich habe versucht, es über den Interface Builder und über Code einzustellen, aber beides hat nicht funktioniert. Ich habe auch einen Fehlerbericht eingereicht.

Geben Sie hier die Bildbeschreibung ein

In der Zwischenzeit habe ich eine kleine Problemumgehung, um dies zu erreichen. Ich zeichne einfach die Linie auf der Zelle. Erstellen Sie eine Unterklasse von UITableViewCellund überschreiben Sie die drawRectMethode. Vergessen Sie auch nicht, die Separator-Eigenschaft von UITableViewauf None zu setzen. Hier ist der Code. Es ist in Swift, aber da es im Grunde C ist, können Sie dasselbe auch in Objective-C verwenden.

override func drawRect(rect: CGRect) {
    super.drawRect(rect)

    let context = UIGraphicsGetCurrentContext()
    CGContextSetStrokeColorWithColor(context, UITableView().separatorColor.CGColor) // seperator color
    CGContextSetLineWidth(context, 2) // separator width

    CGContextMoveToPoint(context, 0, self.bounds.size.height)
    CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height)
    CGContextStrokePath(context)
}
Isuru
quelle
Vielen Dank. CGContextSetLineWidth(context, 1)ist näher an der Standardeinstellung, falls jemand einen "Vanille" -Look möchte
Michael
4

Das Zurücksetzen von separatorInset behebt dieses Problem für mich:

if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [self.tableView setSeparatorInset:self.tableView.separatorInset];
}
user2088250
quelle
Dies ist sicherer, wenn Sie nicht auch auf ios6 abzielen.
Yunus Nedim Mehel
3

Die Lösung:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

    if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [tableView setLayoutMargins:UIEdgeInsetsZero];
    }

   if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
   }
}
Tee
quelle
2

Beachten Sie, dass das Setzen des separatorInset von tableView auf UIEdgeInsetsZero gleichzeitig den linken Rand von Abschnittsüberschriften zu durchbrechen scheint! (Zumindest unter iOS 7.1)

Wenn Sie Abschnittsüberschriften mit tableView: titleForHeaderInSection: anzeigen möchten und dennoch den gewünschten Effekt erzielen möchten, dass zwischen UITableViewCells kein Zeilenumbruch auftritt, müssen Sie das separatorInset direkt in den Zellen anstelle von tableView festlegen!

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ...
    [cell setSeparatorInset:UIEdgeInsetsZero];
Bluezen
quelle
1

Für iOS8 + hat das bei mir funktioniert,

tableView.layoutMargins = UIEdgeInsetsZero

und in cellForRowAtIndexPathMethode:

cell.layoutMargins = UIEdgeInsetsZero;
Mohammad Zaid Pathan
quelle
0
- (void)viewDidLoad
{
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

    [super viewDidLoad];

    // Additional setup
}

Hinweis: Die Zeile setSeparatorStyle muss über dem Superaufruf liegen.

Matt Rundle
quelle
Das beantwortet die Frage nicht.
König-Zauberer
0
@implementation UITableView (HGApperance) 
-(void)setSeparatorXMargin:(CGFloat)margin{
    // iOS 7
    if ([self respondsToSelector:@selector(setSeparatorInset:)]) {
        [self setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self respondsToSelector:@selector(layoutMargins)]) {
        self.layoutMargins = UIEdgeInsetsZero;
    }
}
@end

Für TableviewCell funktioniert Willams Antwort perfekt.

HamGuy
quelle
0

Für iOS8 und höher

Wenn Sie feststellen, dass nicht alle Lösungen wie ich funktionieren, haben Sie möglicherweise die Unterklasse von verwendet UITableViewCellund überschreiben dielayoutSubviews Methode . Wenn Sie zwei der Bedingungen erfüllen, lesen Sie weiter.

Mach oder überprüfe es Schritt für Schritt.

1, nach alloc und init UITableView, setzen Sie seine layoutMarginsEigenschaft.

if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
    _tableView.layoutMargins = UIEdgeInsetsZero ;
}

2 、- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathLegen Sie in der Methode nach dem Zuweisen und Initiieren Ihrer benutzerdefinierten Eigenschaft UITableViewCelldie layoutMarginsEigenschaft fest.

if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
    cell.layoutMargins = UIEdgeInsetsZero ;
}

3 、 Der wichtigste Teil kommt ins - (void)layoutSubviewsSpiel . Wenn Sie die Methode von UITableViewCell überschreiben, vergessen Sie nicht, sie als super zu bezeichnen .

- (void)layoutSubviews
{
    [super layoutSubviews] ;

    // layout the subviews
}
KudoCC
quelle
0

Xamarin.iOS Version

Ich habe das UITableView-Trennzeichen in Xamarin.iOS unter iOS 8.4 mit Hilfe von Beiträgen von Luis E. Prado und King-Wizard um die gesamte Breite erweitert . Ich musste sowohl SeparatorInset als auch LayoutMargins festlegen, damit es funktioniert. Ich habe keine Prüfungen für niedrigere iOS-Versionen geschrieben, da ich auf iOS 8 und höher abziele.

Ich habe die folgenden zwei C # -Erweiterungsmethoden geschrieben, um die volle Breite des UITableView-Trennzeichens auf UITableView- oder UITableViewCell-Ebene festzulegen. Je nach gewünschtem Effekt können Sie eine oder beide dieser Methoden verwenden (siehe Erläuterungen unten).

UITableView

Legen Sie die UITableView-Eigenschaften fest, um die Trennzeichen zu ändern, die nach leeren Zellen angezeigt werden. Diese SetLayoutMarginsZero-Methode kann über die ViewDidLoad-Methode des zugehörigen ViewController aufgerufen werden.

public static void SetLayoutMarginsZero(this UITableView tableView)
{
    tableView.SeparatorInset = UIEdgeInsets.Zero;
    tableView.LayoutMargins = UIEdgeInsets.Zero;
}

UITableViewCell

Legen Sie die UITableViewCell-Eigenschaften fest, um die Trennzeichen zu ändern, die nach aufgefüllten Zellen angezeigt werden. Diese SetLayoutMarginsZero-Methode kann über die TableViewSource GetCell-Methode aufgerufen werden.

public static void SetLayoutMarginsZero(this UITableViewCell tableViewCell)
{
    tableViewCell.SeparatorInset = UIEdgeInsets.Zero;
    tableViewCell.LayoutMargins = UIEdgeInsets.Zero;
    tableViewCell.PreservesSuperviewLayoutMargins = false;
}
Mobiler Dan
quelle