it-swarm.com.de

Entfernen Sie SeparatorInset unter iOS 8 UITableView für XCode 6 iPhone Simulator

Ich habe ein seltsames Leerzeichen auf UITableView für iPhone 6 Simulator (iOS 8) auf XCode 6 GM gefunden. Ich habe versucht, die SeparatorInset sowohl aus dem Storyboard als auch aus dem Code zu setzen, aber der Leerraum ist bis dahin. 

Der folgende Code funktioniert unter iOS 7, jedoch nicht unter iOS 8 (iPhone 6-Simulator).

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [tableView setSeparatorInset:UIEdgeInsetsZero];
    }
}

Ich habe den Screenshot unten angehängt:

iPhone 6 Simulator weird white space on tableview

Ich benutze übrigens AutoLayout. Ich hoffe, jemand kann mir einen Weg zeigen, um den seltsamen weißen Raum auf der TableView zu entfernen.

61
Ricky

Vielen Dank, Student, dass Sie mich mit dem Kommentar "Try this self.myTableView.layoutMargins = UIEdgeInsetsZero;" in die richtige Richtung gezeigt haben. Diese Codezeile funktioniert nur unter iOS 8, da layoutMargins nur unter iOS 8 verfügbar ist. Wenn ich denselben Code unter iOS 7 ausführen, stürzt er ab.

@property(nonatomic) UIEdgeInsets layoutMargins
Description   The default spacing to use when laying out content in the view.
Availability  iOS (8.0 and later)
Declared In   UIView.h
Reference UIView Class Reference

enter image description here

Im Folgenden finden Sie die richtige Antwort, um dieses seltsame Leerzeichen zu lösen, indem Sie tableview layoutMargins und cell layoutMargins als UIEdgeInsetsZero festlegen, sofern vorhanden (für iOS 8). Und es wird auch unter iOS 7 nicht abstürzen. 

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

Siehe den Screenshot unten: -

enter image description here

117
Ricky

Versuchen Sie, eine UITableViewCell-Klassenkategorie zu erstellen, und fügen Sie diesen Getter hinzu

- (UIEdgeInsets)layoutMargins {
    return UIEdgeInsetsZero;
}

in iOS7 wird dies nicht als cos bezeichnet. In SDK gibt es diese Eigenschaft nicht. , und es verursacht keinen Absturz ; In iOS8 wird diese Funktion bei jeder Verwendung der Zelle aufgerufen

Für mich geht das 

49
Will Zhang

Meine Lösung mit nur drei Zeilen Code:

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)row{
    //
    // ... your code ...
    //
    if ([cell respondsToSelector:@selector(preservesSuperviewLayoutMargins)]){
        cell.layoutMargins = UIEdgeInsetsZero;
        cell.preservesSuperviewLayoutMargins = false;
    }
    return cell;
}
23
Guido Lodetti

IOS8 führt ein neues Konzept mit dem Namen Configuring Content Margins ein. Außerdem wird eine neue Eigenschaft mit dem Namen layoutMargins eingeführt. Einzelheiten zu dieser Eigenschaft finden Sie in der Dokumentation zu Apple Doc. Der Typ von layoutMargins ist UIEdgeInsets. Der Wert ist standardmäßig {8,8,8,8}. Um die Trennlinie von TableView in IOS8 zu entfernen, müssen Sie neben tableView.seperatorInset = UIEdgeInsetsZero auch Folgendes tun:

Definieren Sie zuerst das Makro

#define isIOS8SystemVersion (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)

Fügen Sie in der UITableViewDelegate-Methode Folgendes hinzu:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
         static NSString *reuseId = @"cellReuseID" ;
         UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId];
         if(!cell){
             cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseId];     
         if(isIOS8SystemVersion){   
             cell.layoutMargins = UIEdgeInsetsZero;
             cell.preservesSuperviewLayoutMargins =NO ;
         }

    }

Dadurch wird die Trennlinie entfernt. Sie können auch wie folgt vorgehen:

    UITableView *tableView = [[UITableView alloc] init];
    if(isIOS8SystemVersion){
         tableView.layoutMargins = UIEdgeInsetsZero ;
    }

und in der UITableViewDelegate-Methode hinzufügen:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     static NSString *reuseId = @"cellReuseID" ;
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId];
     if(!cell){
         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseId];     
     if(isIOS8SystemVersion){   
         cell.layoutMargins = UIEdgeInsetsZero;
     }
}
16
monjer

In meinem Fall in Xcode 6.2 muss ich zusätzlich zu Will Qs Antwort auf Main.storyboard gehen und den UITableViewCell> Attributes Inspector auswählen. Ändern Sie die Dropdown-Liste der Trennzeichen von Default Insets in Custom Insets . Ändern Sie den linken Einschub von 15 auf 0.

enter image description here

12
voratima

Problemumgehung für iOS 7 und iOS 8

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    cell.separatorInset = UIEdgeInsetsMake(0.0f, cell.frame.size.width, 0.0f, 0.0f); 
}
10
user3894518

In iOS8 müssen Sie den Inset sowohl auf Zeilen- als auch auf Tabellenebene einstellen.

Zeilenebene in cellForRowAtIndexPath:

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

Tabellenebene in viewDidLoad:

[tableReference setSeparatorInset:UIEdgeInsetsZero];

Danach ist es eine gute Idee, Ihr Projekt zu REINIGEN. Bei einigen Gelegenheiten stellte ich fest, dass diese Änderungen nicht direkt in der ausführbaren App im Simulator eingeführt wurden.

9
Vincent

für iOS 8

versuchen Sie, indem Sie cell.layoutMargins = UIEdgeInsetsZero; in der cellForRowAtIndexPath-Methode festlegen

5
Yogendra

Wenn Sie die weiße Linie entfernen möchten, das Trennzeichen jedoch beibehalten wird, setzen Sie cell.backgroundColor einfach auf die tableView backgroundColor. Durch das Festlegen von cell.contentView.backgroundColor wird das Problem nicht behoben. 

3
honcheng

Ich habe viele Möglichkeiten ausprobiert, keine davon funktioniert, aber diese funktioniert für mich.

 WORK FOR ME

1
Harshad

Fügen Sie einfach Folgendes hinzu:

tableView.separatorStyle = .none
0
J. Doe

Fügen Sie Startup-Images für iPhone 6 und Plus hinzu. Vor dem Hinzufügen der Bilder wird das Telefon im Skalierungsmodus ausgeführt, d. H. Ältere Apps werden an die neuen Bildschirmgrößen angepasst. Dies kann die Zeilen verursachen. Die neuen Bilder sind Retina HD 5.5 (iPhone6Plus) 1242x2208 und Retina HD 4.7 (iPhone6) 750x1334.

0

Ich habe statisch UITableView und wollte den Rand eines Zellseparators zum linken Rand verschieben.

Dank der obigen Antworten war dies meine Lösung

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    // needed to shift the margin a specific cell to the left Edge
    if indexPath.section == 3 && indexPath.row == 0 {
        cell.layoutMargins = UIEdgeInsetsZero
        cell.preservesSuperviewLayoutMargins = false
        cell.separatorInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)
    }
}
0
DogCoffee

Um Ihre UITableView-Trennzeichen-Insets sowohl für iOS7 als auch für iOS8 auf Null zu setzen, nehmen Sie anstelle einer Änderung des Codes eine Änderung in Xib für UITableView vor. 

0
strohtennis

Siehe iOS 8 UITableView Separator Inset 0 funktioniert nicht

Grundsätzlich müssen Sie sowohl cell.layoutMargin als auch layoutMargin von tableView einstellen. YMMV, aber ich musste die Tabellensicht in layoutSubviews einrichten, bevor es funktionieren würde!

0
cdstamper