wake-up-neo.net

insitutionen für UITableView-Separatoren für iOS 9

Ich habe ein Problem mit Trennzeichen zwischen UITableViewCells in UITableView in iOS 9. Sie haben den deutlichen linken Rand. Ich habe bereits Code zum Entfernen von Abständen, der von iOS 8 eingeführt wurde, aber er funktioniert nicht mit iOS 9. Es sieht so aus, als hätten sie noch etwas hinzugefügt. Ich vermute, es könnte mit layoutMarginsGuide zusammenhängen, aber ich habe es noch nicht herausgefunden. Hat jemand ein ähnliches Problem und fand die Lösung heraus?

47
Julian Król

Okay, Ich habe die Lösung herausgefunden . Das einzige, was dazu erforderlich ist, ist, das Flag UITableView für die präsentierende Instanz von cellLayoutMarginsFollowReadableWidth zu setzen.

myTableView.cellLayoutMarginsFollowReadableWidth = NO;

Ich wollte etwas Referenz in der Dokumentation finden, aber es scheint noch nicht fertig zu sein, nur auf der Diff-Seite erwähnt .

Da das Flag aus Gründen der Rückwärtskompatibilität in iOS 9 eingeführt wurde, sollten Sie vor dem Festlegen einen Haken setzen:

if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
    myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}

Für Swift 2.0 können Sie #available verwenden, um die iOS-Version zu überprüfen.

if #available(iOS 9, *) {
    myTableView.cellLayoutMarginsFollowReadableWidth = false
}

Außerdem müssen Sie es mit Xcode 7 oder höher kompilieren.

EDIT 

Bitte beachten Sie, dass dies die einzige erforderliche Korrektur ist, wenn Ihre Trennzeichen bis zu iOS 8 "in Ordnung" waren. Andernfalls müssen Sie ein wenig mehr ändern. Informationen dazu finden Sie bereits in SO.

67
Julian Król

Wenn Sie dies im Interface Builder tun möchten. Das Standard-Trennzeichen ist Automatic. Ändern Sie es in custom, indem Sie die Dropdown-Liste auswählen.

 enter image description here

26
ArunGJ

Swift 2.2 iOS 9.3

In viewDidLoad

tableView.cellLayoutMarginsFollowReadableWidth = false

In UITableViewDelegates

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if cell.respondsToSelector(Selector("setSeparatorInset:")){
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector(Selector("setPreservesSuperviewLayoutMargins:")) {
        cell.preservesSuperviewLayoutMargins = false
    }
    if cell.respondsToSelector(Selector("setLayoutMargins:")){
        cell.layoutMargins = UIEdgeInsetsZero
    }
}
16
H.Yuu

Swift 3.0/4.0

tableView.cellLayoutMarginsFollowReadableWidth = false

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UIView.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
    if cell.responds(to: #selector(setter: UIView.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
}
11
derdida

Perfekte Lösung bis iOS 9

In viewDidLoad

- (void)viewDidLoad {
    [super viewDidLoad];
    //Required for iOS 9
    if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 9.0) {
        self.testTableView.cellLayoutMarginsFollowReadableWidth = NO;
    }
}

Fügen Sie in TableViewDelegate-Methoden folgenden Code hinzu:

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

    // Remove seperator inset
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    // Prevent the cell from inheriting the Table View's margin settings
    if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
        [cell setPreservesSuperviewLayoutMargins:NO];
    }

    // Explictly set your cell's layout margins
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}
11
Bhuvan Bhatt

Aufgrund verschiedener Antworten hier, kann ich die Lücke mit den folgenden Codezeilen in Swift aus dem Trennzeichen entfernen:

tableView.separatorInset = UIEdgeInsetsZero
tableView.layoutMargins = UIEdgeInsetsZero
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero

Ich habe immer noch diese kleine Lücke vor dem Text:

 enter image description here

5
codelearner

In iOS 9 hat das perfekt funktioniert.

Für OBJ-C

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(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];
        }
         return cell;
    }
4
jithin

Die akzeptierte Antwort hat bei mir nicht funktioniert. Bis zum Verschieben von setCellLayoutMarginsFollowReadableWidth VOR SETLayoutMargins (noch für iOS 8 erforderlich):

if([_tableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)]) {
  _tableView.cellLayoutMarginsFollowReadableWidth = NO;
}

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

Für iOS 8 und 9

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) [[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero];
    if ([UITableView instancesRespondToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) [[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO];
}

und

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) [cell setLayoutMargins:UIEdgeInsetsZero];
}
1
Javier Sánchez
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    // Remove seperator inset

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

    // Prevent the cell from inheriting the Table View's margin settings

    if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
        [cell setPreservesSuperviewLayoutMargins:NO];
    }

    // Explictly set your cell's layout margins

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

}
1
Mihawk

Dies ist meine Lösung für Swift 3.0/iOS 10 in XCode 8.2.1.

Ich habe eine Unterklasse für UITableview erstellt, die für IB funktioniert und programmgesteuert Tabellenansichten erstellt.

import UIKit

class EXCSuperTV: UITableView
{
    required init?(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)
        setupView()
    }

    override init(frame: CGRect, style: UITableViewStyle)
    {
        super.init(frame: frame, style: style)
        setupView()
    }

    func setupView() {}
}

class EXCNoFooter: EXCSuperTV
{
    override func setupView()
    {
        super.setupView()
        //tableFooterView = UIView.Zero()
    }
}


class EXCMainTV: EXCNoFooter
{
    override func setupView()
    {
        super.setupView()
        separatorInset = UIEdgeInsets.zero
    }
}
0
Darkwonder