it-swarm.com.ru

Удалить SeparatorInset на iOS 8 UITableView для симулятора iPhone XCode 6

Я обнаружил странный пробел на UITableView для iPhone 6 Simulator (iOS 8) на XCode 6 GM. Я пытался установить SeparatorInset как из раскадровки, так и из кода, но пробел остается там. 

Следующий код работает на iOS 7, но не на iOS 8 (симулятор iPhone 6).

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

Я прикрепил скриншот ниже:

iPhone 6 Simulator weird white space on tableview

Кстати, я использую AutoLayout. Я надеюсь, что кто-то может показать мне способ убрать странные пробелы в TableView.

61
Ricky

Спасибо студенту за то, что он указал мне правильное направление с комментарием "Try this self.myTableView.layoutMargins = UIEdgeInsetsZero;" Эта строка кода будет работать только на iOS 8, потому что layoutMargins доступен только для iOS 8. Если я запусту тот же код на iOS 7, он вылетит.

@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

Ниже приведен правильный ответ, чтобы решить эту странную пустую область, задав tableview layoutMargins и cell layoutMargins как UIEdgeInsetsZero, если он существует (для iOS 8). И это не будет сбой на iOS 7, а также. 

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

Смотрите скриншот ниже: -

enter image description here

117
Ricky

Попробуйте создать категорию класса UITableViewCell и добавить этот метод получения

- (UIEdgeInsets)layoutMargins {
    return UIEdgeInsetsZero;
}

в iOS7 это не будет называться, потому что в SDK нет этого свойства ,, и это не приведет к сбою ; В iOS8 это будет вызываться при каждом использовании ячейки

Меня устраивает 

49
Will Zhang

Мое решение всего с тремя строками кода:

-(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 представляет новую концепцию с именем Настройка полей содержимого, также вводится новое свойство с именем layoutMargins, для получения подробной информации о свойстве см. Apple Doc. Тип layoutMargins - UIEdgeInsets, по умолчанию значение равно {8,8,8,8}. Чтобы удалить разделительную строку TableView в IOS8, помимо установки tableView.seperatorInset = UIEdgeInsetsZero, вы также должны сделать следующее:

Сначала определите макрос

#define isIOS8SystemVersion (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)

В методе UITableViewDelegate добавьте:

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

    }

Выполнение этих действий удалит разделительную линию. Вы также можете сделать следующее:

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

и в методе UITableViewDelegate добавьте:

- (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

В моем случае в Xcode 6.2, в дополнение к ответу Уилла Q, мне нужно перейти на Main.storyboard> выбрать UITableViewCell> Инспектор атрибутов. Измените выпадающий список Разделитель со вкладок по умолчанию на Пользовательские вставки . Измените левую вставку с 15 на 0.

enter image description here

12
voratima

Обходной путь для iOS 7 и iOS 8

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

В iOS8 вы должны установить Inset и на уровне строк и на уровне таблицы.

Уровень строки в cellForRowAtIndexPath:

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

Уровень таблицы в viewDidLoad:

[tableReference setSeparatorInset:UIEdgeInsetsZero];

После этого будет хорошей идеей ОЧИСТИТЬ ваш проект. В некоторых случаях я отмечал, что эти изменения не были напрямую введены в исполняемое приложение в симуляторе.

9
Vincent

для iOS 8

попробуйте установить cell.layoutMargins = UIEdgeInsetsZero; в методе cellForRowAtIndexPath

5
Yogendra

Если вы хотите удалить белую линию, но оставить разделитель как есть, просто установите для cell.backgroundColor значение tableView backgroundColor. Просто установка cell.contentView.backgroundColor не делает проблему исчезнуть. 

3
honcheng

Я пробовал много способов, ни один из них не работает, но этот работает для меня.

 WORK FOR ME

1
Harshad

Просто добавьте следующее:

tableView.separatorStyle = .none
0
J. Doe

Добавьте загрузочные образы для iPhone 6 и Plus. Перед добавлением изображений телефон работает в режиме масштабирования, то есть старые приложения масштабируются в соответствии с новыми размерами экрана. Это может быть причиной появления строк ........ Новые изображения: Retina HD 5.5 (iPhone6Plus) 1242x2208 и Retina HD 4.7 (iPhone6) 750x1334.

0
Hannes Sverrisson

У меня есть статическая переменная UITableView, и я хотел сдвинуть поле разделителя ячеек влево.

Благодаря приведенным выше ответам, это было мое решение

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

Чтобы сделать ваши разделители UITableView равными нулю для iOS7 и iOS8, вместо внесения изменений в код внесите изменение в xib для UITableView, изменив View-> Mode-> Aspect Fill. 

0
strohtennis

Смотрите iOS 8 UITableView разделитель 0 не работает

По сути, вам нужно установить как cell.layoutMargin, так и layoutMargin tableView. YMMV, но мне нужно было настроить представление таблицы в layoutSubviews, прежде чем это сработает!

0
cdstamper