Пользовательские закругленные углы для первой и последней ячейки в сгруппированном UITableView

В моем приложении для iPhone в настоящее время отображается сгруппированная таблица с 2 разделами. Я попытался изменить радиус закругленных углов в первой и последней ячейках каждого раздела (или в той же ячейке в случае разделов с одной строкой), используя:

cell.layer.cornerRadius = 4;

или действуя на всю таблицу:

self.tableView.layer.cornerRadius = 4;

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

Идеальным решением было бы настроить верхние углы в первом и нижние углы в последнем.

Какие-либо предложения?


person Claus    schedule 19.09.2012    source источник
comment
Сгруппированный стол Углы каждой группы закруглены обряд?   -  person IronManGill    schedule 19.09.2012
comment
я столкнулся с той же проблемой ... и я не думаю, что сгруппированная таблица очень эффективна, когда вы хотите редактировать ее формы   -  person Neo    schedule 19.09.2012
comment
Взгляните на это; может помочь: stackoverflow.com/questions/1106861/   -  person Zar    schedule 19.09.2012
comment
Разве сгруппированный tableView не имеет закругленного угла ??   -  person TheTiger    schedule 19.09.2012


Ответы (5)


Самый простой способ:

  1. Создайте пользовательские ячейки в файле xib, установите их уникальные идентификаторы, например: @"beginCell", @"middleCell", @"endCell". Вы можете сделать это согласно этому руководству: http://www.bdunagan.com/2009/06/28/custom-uitableviewcell-from-a-xib-in-interface-builder/

  2. В методе - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath вы должны найти, находитесь ли вы в середине или в начале / конце раздела, и использовать ячейку с правильным идентификатором.

person pro_metedor    schedule 19.09.2012
comment
Вы также можете выполнить пользовательское рисование ячеек, как и раньше, но сделайте это в методе tableView: cellForRowAtIndexPath:. Опять же, вам понадобятся отдельные идентификаторы для средней и начальной / конечной ячеек. - person pro_metedor; 19.09.2012

Вот что работает в Swift 4.2:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
{
    let cornerRadius = 5
    var corners: UIRectCorner = []

    if indexPath.row == 0
    {
        corners.update(with: .topLeft)
        corners.update(with: .topRight)
    }

    if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1
    {
        corners.update(with: .bottomLeft)
        corners.update(with: .bottomRight)
    }

    let maskLayer = CAShapeLayer()
    maskLayer.path = UIBezierPath(roundedRect: cell.bounds,
                                  byRoundingCorners: corners,
                                  cornerRadii: CGSize(width: cornerRadius, height: cornerRadius)).cgPath
    cell.layer.mask = maskLayer
}
person meaning-matters    schedule 22.02.2019
comment
raywenderlich.com/: Примечание. Рисование статических видов с помощью Core Graphics обычно выполняется достаточно быстро, но если ваши виды перемещаются или нуждаются в частой перерисовке, вам следует использовать слои Core Animation. Базовая анимация оптимизирована таким образом, что большую часть обработки выполняет графический процессор, а не ЦП. Напротив, ЦП обрабатывает отрисовку вида, выполняемую Core Graphics в отрисовке (_ :) - person rs7; 20.06.2020
comment
@ rs7 Похоже, это усложняет задачу, и я не думаю, что это нужно с точки зрения производительности. Но, пожалуйста, отправьте свой ответ и пингуйте меня; Я бы хотел посмотреть, как это обернется. - person meaning-matters; 23.06.2020
comment
Это идеальный ответ. - person Umair_UAS; 23.12.2020

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

person IronManGill    schedule 19.09.2012

UIView  *view = [UIView alloc]initWithFrame:YourFrame];
view.layer.cornerRadius = 8;

cell.backgroundView = view;

И не забудьте, что цвет фона UITableView должен быть прозрачным.

person SachinVsSachin    schedule 19.09.2012
comment
это нормально, если есть только одна строка. Но с несколькими рядами единственные закругленные углы, которые нужно изменить, должны быть верхними для первого и нижними для последнего. Я думаю, что этот подход затрагивает также все углы между ячейками. - person Claus; 19.09.2012
comment
- (void) tableView: (UITableView *) tableView willDisplayCell: (UITableViewCell *) ячейка forRowAtIndexPath: (NSIndexPath *) indexPath {if (indexPath.row == 0 || indexPath.row == [tableView numberOfRowsInSection] - indexPath.section 1) {UIView * view = [[UIView alloc] initWithFrame: CGRectMake (0, 0, 200, 44)]; view.layer.cornerRadius = 4; view.backgroundColor = [UIColor redColor]; cell.backgroundView = просмотр; //cell.backgroundColor = [UIColor clearColor]; }} - person Claus; 19.09.2012

Если вам нужны просто закругленные углы, есть другое решение (вдохновленное сгруппированным стилем нативного uitableview (cell), в slowmo :)). Должно получиться примерно так:

Подкласс ячейки ...

@interface MyCell : UITableViewCell
@property (nonatomic) top;
@property (nonatomic) bottom;
@end

@implementation MyCell
-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.backgroundColor = [UIColor clearColor]; // remove white default background
        //example settings, UIImageViews with resizable images can be used too
        self.backgroundView = [[UIView alloc] init];
        self.selectedBackgroundView = [[UIView alloc] init];
        self.backgroundView.backgroundColor = [UIColor greenColor];
        self.selectedBackgroundView.backgroundColor = [UIColor blueColor];
        self.backgroundView.layer.cornerRadius = self.selectedBackgroundView.layer.cornerRadius = 5; // 
    }
    return self;
}
-(void)layoutSubviews{
    [super layoutSubviews];
    self.backgroundView.frame = self.selectedBackgroundView.frame = UIEdgeInsetsInsetRect(self.bounds, UIEdgeInsetsMake(self.top?0:-self.backgroundView.layer.cornerRadius, 0, self.bottom?0:-self.backgroundView.layer.cornerRadius, 0));
}
-(void)setTop:(BOOL)top{
    _top = top;
    [self setNeedsLayout];
}
-(void)setBottom:(BOOL)bottom{
    _bottom = bottom;
    [self setNeedsLayout];
}
@end

В dataSource вы можете просто сделать это: ...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
      ...cell initialization stuff...
      [(MyCell *)cell setTop:(indexPath.row == 0)];
      [(MyCell *)cell setBottom:(indexPath.row == [tableView numberOfRowsInSection:indexPath.section]-1)];

      return cell;
}

Плюсы:

  • один фон для всех ячеек
  • легко использовать
  • animateable (вы меняете позиции вместо изображений)
  • можно использовать и для простого стиля (но следите за разделами :))

Минусы:

  • подкласс для ячейки необходим (я не мог найти способ настроить положение фона даже после изменения rowHeight)
  • не решает мою проблему с закругленными углами всего раздела (вы должны вручную скруглить углы для разреза)

Надеюсь, это кому-то поможет, но имейте в виду, что этот код не протестирован! Я реализовал эту идею за несколько минут до публикации этого ответа, и, похоже, она работает :)

person JakubKnejzlik    schedule 28.11.2013