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

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

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

введите здесь описание изображения

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

введите здесь описание изображения

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


person Alessio Crestani    schedule 09.01.2014    source источник
comment
У вас есть только один раздел в tableview или у вас есть больше?   -  person Rashad    schedule 09.01.2014
comment
Нет, один на все дни, когда у меня есть уведомление.   -  person Alessio Crestani    schedule 09.01.2014


Ответы (7)


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

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

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

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

person Zeeshan    schedule 09.01.2014
comment
где viewHeader означает? он не инициализирован - person Alessio Crestani; 09.01.2014
comment
да, я знаю, но я не понимаю, что я должен поставить вместо viewHeader, это функция делегата, и я не вижу внутри никакой инициализации viewHeader: P - person Alessio Crestani; 09.01.2014
comment
viewHeader — это, по сути, UIView, который мы вернем для использования в качестве раздела заголовка. -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section — функция делегата. поместите его в свой UITableView View Controller. - person Zeeshan; 09.01.2014
comment
я ничего не вижу вместо 2013 сейчас О_О - person Alessio Crestani; 09.01.2014
comment
Вы создали NSMutableArray и отдельно добавили в него свои годы? если не сделать. а в тебе -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection: дают [lblTitle setText:[array objectAtIndex:section] - person Zeeshan; 09.01.2014

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

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

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

введите здесь описание изображения

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

введите здесь описание изображения

НЕОБЯЗАТЕЛЬНО:

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

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

}
person Neiman Aleksei    schedule 27.03.2016
comment
Работает также, если табличное представление и ячейки находятся в отдельных xibs (без раскадровки). - person Nicolas Miari; 05.09.2018
comment
Это также работает без раскадровки или xibs. Если вы создаете таблицу программно, и UITableView, и UITableViewCell предоставляют свойство .separatorInset. Установите для ячейки значение .zero, а для таблицы — значение, которое вы хотите. - person NSRover; 20.01.2020

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;

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

person Rashad    schedule 09.01.2014
comment
Я думаю, что это раствор, но мне это не ясно. я должен переопределить - (UIView *) tableView: (UITableView *) tableView viewForHeaderInSection: (NSInteger) section; и как переместить 15 пикселей вправо внутри этого делегата? можешь привести пример? - person Alessio Crestani; 09.01.2014
comment
@AlessioCrestani›› Выходные. Извините за опоздание. :) - person Rashad; 12.01.2014

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

-(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];
    }
}
person mike.tihonchik    schedule 13.04.2016

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

введите здесь описание изображения

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

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

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

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

        return title
    }
person D. Rothschild    schedule 03.09.2016

в вашем методе 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];

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

person Retro    schedule 09.01.2014
comment
это не еловая ячейка, в tableview много разделов. Это только пример. - person Alessio Crestani; 09.01.2014
comment
это будет делаться для всех разделов и ячеек, и вы также можете обусловить его своей конкретной ячейкой или разделом. - person Retro; 09.01.2014