Rounded Corners only on Top of a UIView

后端 未结 10 1958
别跟我提以往
别跟我提以往 2020-11-29 22:53

Hi i am searching a clean solution without overwriting drawRect or stuff like that to create a UIView with Rounded corners on the Top of the

10条回答
  •  孤独总比滥情好
    2020-11-29 23:40

    I worked this out with the help of Ashley.

    First of all i subclassed a UIView. Creating a own constructor for my Class called - (id)initWithContentView:(UIView *)aView forTableView:(UITableView *)table andIndex:(NSIndexPath *)indexPath;. In this constructor i determine what kind of table cell i am want to style.

    Then i overwrite l - (void)layoutSubviews to create the CAShapeLayer and applying the layer mask.

    .h File Code

    typedef enum {
        tableCellMiddle,
        tableCellTop,
        tableCellBottom,
        tableCellSingle
    } tableCellPositionValue;
    
    @interface TableCellBackgrounds : UIView
    {
        tableCellPositionValue position;
    }
    
    - (id)initWithContentView:(UIView *)aView forTableView:(UITableView *)table andIndex:(NSIndexPath *)indexPath;
    
    @end
    

    .m File Code

    - (id)initWithContentView:(UIView *)aView forTableView:(UITableView *)table andIndex:(NSIndexPath *)indexPath
    {
        self = [super initWithFrame:aView.frame];
    
        [self setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
    
        if(self)
        {
            [self setBackgroundColor:[UIColor colorWithRed:(float)230/255 green:(float)80/255 blue:(float)70/255 alpha:1]];
    
            if(table.style == UITableViewStyleGrouped)
            {
                int rows = [table numberOfRowsInSection:indexPath.section];
    
    
                if(indexPath.row == 0 && rows == 1)
                {
                    self.layer.cornerRadius = 11;
                    position = tableCellSingle;
                }
                else if (indexPath.row == 0)
                    position = tableCellTop;
                else if (indexPath.row != rows - 1) 
                    position = tableCellMiddle;
                else 
                    position = tableCellBottom;
            }
        }
        return self;
    }
    
    - (void)layoutSubviews
    {
        [super layoutSubviews];
    
        if(position == tableCellTop)
        {
            CAShapeLayer *maskLayer = [CAShapeLayer layer];
            maskLayer.path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:(CGSize){10.0, 10.0}].CGPath;
            self.layer.mask = maskLayer;
        }
        else if (position == tableCellBottom)
        {
            CAShapeLayer *maskLayer = [CAShapeLayer layer];
            maskLayer.path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight cornerRadii:(CGSize){10.0, 10.0}].CGPath;
            self.layer.mask = maskLayer;
        } 
    }
    

提交回复
热议问题