Сохранять UITableView в заголовке, но нет в разделителе на IOS7

21

с переходом на iOS7 разделитель имеет 15px дополнение к левой стороне. Я знаю, что я могу удалить это дополнение с помощью функции вставки разделителя в настройке UITableView в файле xib, но мне нужно сохранить заголовок текста с заполнением. Как это сделать?

по умолчанию:

с настройкой на вставке разделителя на 0:

Мне нужно сохранить разделители, как показано на рисунке 2, но заголовок с «2013» как картинка 1.

    
задан Alessio Crestani 09.01.2014 в 11:04
источник
  • У вас есть только один раздел в tableview или у вас есть еще? –  Rashad 09.01.2014 в 11:17
  • Нет, один на все дни, когда у меня есть уведомление. –  Alessio Crestani 09.01.2014 в 11:25

7 ответов

14

для Seperator вы можете установить его через Storyboard

, а для заголовка создайте собственный заголовок, подобный этому

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
  UIView *viewHeader = [UIView.alloc initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 28)];
  UILabel *lblTitle = [UILabel.alloc initWithFrame:CGRectMake(6, 3, 136, 21)];

  [lblTitle setFont:[UIFont fontWithName:@"HelveticaNeue" size:13]];
  [lblTitle setTextColor:[UIColor blackColor]];
  [lblTitle setTextAlignment:NSTextAlignmentLeft];
  [lblTitle setBackgroundColor:[UIColor clearColor]];
  [viewHeader addSubview:lblTitle];

  return viewHeader;
}

придайте ему определенную высоту. и дать ему любой текст. сделайте массив для заголовков разделов, которые будут содержать ваши годы.

    
ответ дан Xeieshan 09.01.2014 в 11:43
  • , где стоит viewHeader? он не инициализирован –  Alessio Crestani 09.01.2014 в 11:51
  • Извините, скопированная папка не удалась из моего кода: P –  Xeieshan 09.01.2014 в 11:54
  • да, я знаю, но я не понимаю, что мне нужно поставить вместо viewHeader, это функция делегата, и я не вижу никакого initHeader init внутри: P –  Alessio Crestani 09.01.2014 в 11:55
  • viewHeader - это в основном UIView, который мы вернем для использования в качестве раздела заголовка. - (UIView *) tableView: (UITableView *) tableView viewForHeaderInSection: (NSInteger) - функция делегата. поместите его в свой UITableView View Controller. –  Xeieshan 09.01.2014 в 11:57
  • я ничего не вижу вместо 2013 года O_O –  Alessio Crestani 09.01.2014 в 12:00
29

ИСПОЛЬЗОВАНИЕ SWIFT и STORYBOARD

В раскадровке вы можете установить разные вставки разделителя для TableView (заголовок) и для ячеек (разделителей).

Установите для разделителя в ячейку значение 0, выбрав ячейку в раскадровке и установив следующее:

Затем установите разделительную вставку для TableView (для заголовка) на 15, выбрав TableView в Storyboard и установив следующее:

ДОПОЛНИТЕЛЬНО:

Вам также может потребоваться установить поля на ячейках нулевым программным образом, чтобы гарантировать, что разделитель проходит весь путь слева направо. Используйте этот код, если это необходимо в быстром файле контроллера табличного представления:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("YOURCELL", forIndexPath: indexPath) as! UITableViewCell

    // THIS IS THE IMPORTANT PART...
    cell.layoutMargins = UIEdgeInsetsZero
    cell.preservesSuperviewLayoutMargins = false

    return cell

}
    
ответ дан Neiman Aleksei 27.03.2016 в 11:02
  • Это должен быть принятый ответ –  RaffAl 14.06.2016 в 13:35
  • Примите этот ответ. –  Foo 10.08.2017 в 06:28
  • Так просто, должно быть принято! –  zo_chu 28.09.2017 в 12:32
2

UITableView имеет метод делегирования с именем viewForHeaderInSection . Если вы удалите дополнение, а затем в методе делегата добавьте дополнение и верните представление заголовка раздела.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(tableView.frame), 30)];
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(15, 5, 200, 25)];

    // 15 pixel padding will come from CGRectMake(15, 5, 200, 25).
    label.text = @"2013";
    [view addSubview: label];
    return view;
}

Вы можете спроектировать представление заголовка, как вам нравится. Для установки высоты заголовка tableView используйте:

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

Надеюсь, это поможет вам ...)

    
ответ дан Rashad 09.01.2014 в 11:26
  • Я думаю, что это solutin, но мне это непонятно. я должен переопределить - (UIView *) tableView: (UITableView *) tableView viewForHeaderInSection: (NSInteger); и как переместить 15px правое заполнение внутри этого делегата? Можете ли вы привести мне пример? –  Alessio Crestani 09.01.2014 в 11:39
  • @AlessioCrestani >> Выходные. Извините за опоздание. :) –  Rashad 12.01.2014 в 04:04
1

Возможно, вы не захотите создать собственное представление заголовка всегда, потому что иногда его избыток, или ему потребуется пробная версия и ошибка, чтобы сделать его точно таким же, как и заголовок раздела по умолчанию. Вместо этого есть простой хак, который не нуждается в возврате настраиваемого заголовка. Просто установите для этого отступа разделителя значение 0 и поместите некоторое количество пробелов в строку заголовка.

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return @"    Your Title";
}
    
ответ дан rushafi 20.08.2014 в 11:38
  • Добавление пространства в строку никогда не является допустимым вариантом. –  DevZarak 18.08.2015 в 13:07
  • в IOS 9, в списке в моем случае не было необходимости в каких-либо пробелах, просто изменение разделительных вложений переместило текст заголовка в нужное место .... это было здорово –  Erez 13.06.2016 в 13:57
1

Вы можете установить вставки в таблицу (и верхний / нижний колонтитул) и в самой ячейке:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{    
    if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [tableView setSeparatorInset:UIEdgeInsetsMake(0, 10, 0, 0)];
    }    
    if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [tableView setLayoutMargins:UIEdgeInsetsMake(0, 10, 0, 0)];
    }
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}
    
ответ дан mike.tihonchik 13.04.2016 в 15:31
1

Если вы хотите отделить текст раздела от левого поля, вот простой способ, которым я это сделал. В функции, см. Пробел после первой метки кавычки? Просто поставьте столько пробелов, сколько вам нужно до начала текста.

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let title: UILabel = UILabel()

        title.text = " \(sortedSections[section])"
        title.textAlignment = NSTextAlignment.Left

        return title
    }
    
ответ дан D. Rothschild 04.09.2016 в 00:01
-4

в вашем методе cellForRowAtIndeaPath добавьте представление в ячейку, например

UIView* view = [[UIView alloc] initWithFrame:CGrectmake(cell.frame.ori.x, cell.frame.ori.y, 20.0, cell.height)];

view.backgroundColor = desired color

[cell.containView addSubView: view];

добавьте это в свой первый код ячейки, и вы закончили

    
ответ дан Retro 09.01.2014 в 11:20
  • это не пихтовая ячейка, в таблице есть много разделов. Это только пример. –  Alessio Crestani 09.01.2014 в 11:26
  • это будет делать для всего раздела и ячейки, и вы также можете обучить его определенной ячейке или разделу –  Retro 09.01.2014 в 11:28