How do I add a UIImage to grouped UITableViewCell so it rounds the corners?

后端 未结 5 713
囚心锁ツ
囚心锁ツ 2021-02-14 14:38

I\'m trying to add images to table cells in a grouped UITableView but the corners of the images are not clipped. What\'s the best way to go about clipping these (besides clippin

5条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-02-14 15:12

    This was my solution, which could use a little refactoring:

    void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth, float ovalHeight, BOOL top, BOOL bottom)
    {
        float fw, fh;
        if (ovalWidth == 0 || ovalHeight == 0) {
            CGContextAddRect(context, rect);
            return;
        }
        CGContextSaveGState(context);
        CGContextTranslateCTM (context, CGRectGetMinX(rect), CGRectGetMinY(rect));
        CGContextScaleCTM (context, ovalWidth, ovalHeight);
        fw = CGRectGetWidth (rect) / ovalWidth;
        fh = CGRectGetHeight (rect) / ovalHeight;
        CGContextMoveToPoint(context, fw, fh/2);
        CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 0);
    
        NSLog(@"bottom? %d", bottom);
    
        if (top) {
            CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 3);
        } else {
            CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 0);
        }
    
        if (bottom) {
            CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 3);
        } else {
            CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 0);
        }
    
        CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 0);
        CGContextClosePath(context);
        CGContextRestoreGState(context);
    }
    
    - (UIImage *)roundCornersOfImage:(UIImage *)source roundTop:(BOOL)top roundBottom:(BOOL)bottom {
        int w = source.size.width;
        int h = source.size.height;
    
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);
    
        CGContextBeginPath(context);
        CGRect rect = CGRectMake(0, 0, w, h);
        addRoundedRectToPath(context, rect, 4, 4, top, bottom);
        CGContextClosePath(context);
        CGContextClip(context);
    
        CGContextDrawImage(context, CGRectMake(0, 0, w, h), source.CGImage);
    
        CGImageRef imageMasked = CGBitmapContextCreateImage(context);
        CGContextRelease(context);
        CGColorSpaceRelease(colorSpace);
    
        return [UIImage imageWithCGImage:imageMasked];    
    }
    

    Implement those functions, then check the indexPath in the cellForRowAtIndexPath delegate method to determine which corner to round.

    if (indexPath.row == 0) {
                cell.imageView.image = [self roundCornersOfImage:coverImage roundTop:YES roundBottom:NO];
            } else if (indexPath.row == [indexPath length]) {
                cell.imageView.image = [self roundCornersOfImage:coverImage roundTop:NO roundBottom:YES];
            } else {
                cell.imageView.image = coverImage;
            }
    

提交回复
热议问题