Как сделать так, чтобы пользовательский пропуск проходил для изменения потока управления?

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

typedef enum CellBorderMask{
    CellBorderMaskLeft      = 1 << 0,
    CellBorderMaskRigth     = 1 << 1,
    CellBorderMaskTop       = 1 << 2,
    CellBorderMaskBottom    = 1 << 3
}CellBorderMask;




- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    CellBorderMask mask;
    if (indexPath.row == 0){
        mask |= CellBorderMaskTop;
    }

    if(indexPath.row == [tableView numberOfRowsInSection:indexPath.section] - 1) {
        mask |= CellBorderMaskBottom;
    }
    mask |= CellBorderMaskRigth | CellBorderMaskLeft;
    [self addBorder:mask forView:cell.contentView];
}

-(void)addBorder:(CellBorderMask)mask forView:(UIView *)view{
    float onePixel = (1.f / [UIScreen mainScreen].scale);
    float lineWidth = 1 * onePixel;
    CGColorRef cgBorderColor = [UIColor redColor].CGColor;


    CALayer *topBorder = [CALayer layer];
    CALayer *bottomBorder = [CALayer layer];
    CALayer *leftBorder = [CALayer layer];
    CALayer *rightBorder = [CALayer layer];

    //tag layers so it's possible to find and remove them later 
    topBorder.name = @"Border";
    bottomBorder.name = @"Border";
    leftBorder.name = @"Border";
    rightBorder.name = @"Border";

    //remove previously set border layers so they doesn't produce unwanted effect on orientation change
    [self cleanUpOldBorderLayers:view];

    topBorder.frame = CGRectMake(0.0f, 0.0f, view.bounds.size.width, lineWidth);
    topBorder.backgroundColor = cgBorderColor;

    bottomBorder.frame = CGRectMake(0.0f, view.bounds.size.height - lineWidth, view.bounds.size.width, lineWidth);
    bottomBorder.backgroundColor = cgBorderColor;

    leftBorder.frame = CGRectMake(0.0f, 0.0f, lineWidth, view.bounds.size.height);
    leftBorder.backgroundColor = cgBorderColor;

    rightBorder.frame = CGRectMake(view.bounds.size.width - lineWidth, 0.0f, lineWidth, view.bounds.size.height);
    rightBorder.backgroundColor = cgBorderColor;
    if(mask & CellBorderMaskTop){
        [view.layer addSublayer:topBorder];
    }
    if(mask & CellBorderMaskBottom){
        [view.layer addSublayer:bottomBorder];
    }
    if(mask & CellBorderMaskLeft){
        [view.layer addSublayer:leftBorder];
    }
    if(mask & CellBorderMaskRigth){
        [view.layer addSublayer:rightBorder];
    }
}

-(void)cleanUpOldBorderLayers:(UIView *)view{
    NSMutableArray *layerArray = [NSMutableArray new];
    for (CALayer *layer in view.layer.sublayers) {
        if([@"Border" isEqualToString:layer.name]){
            [layerArray addObject:layer];
        }
    }
    for (CALayer *layer in layerArray) {
        [layer removeFromSuperlayer];
    }
}


-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    //need to trigger tableView:willDisplayCell: method on orientation change. 
    //Suggest a better method for this if there is one
    [self.tableView reloadData];
}

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

Чтобы добавить границу в верхний / нижний колонтитул, просто создайте собственное представление в методах делегатов viewForHeaderInSection / viewForFooterInSection и передайте представление методу addBorder:forView выше, прежде чем возвращать его из вашего делегата.

0
задан MangoTatsy 17 January 2019 в 03:17
поделиться