【问题标题】:How to remove corners for round rect bezier path如何去除圆形矩形贝塞尔路径的角落
【发布时间】:2013-04-09 09:09:01
【问题描述】:

我是第一次使用 Core Graphics 进行编程,所以不太清楚我该如何解决这个问题。

我正在绘制圆角矩形贝塞尔路径以及渐变和笔触作为 UITableviewCells 的背景视图。一切都很好,除了如图所示的额外黑角。

我不知道他们为什么要展示以及它们到底是什么。请问有人可以帮我吗?谢谢..

创建单元格的代码

#import "CustomCellBackground.h"
.
.
.

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView 
                             dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
        cell.backgroundView = [[CustomCellBackground alloc] init];
        cell.selectedBackgroundView = [[CustomCellBackground alloc]init];
    }

    // Configure the cell.

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    cell.textLabel.textColor = [UIColor whiteColor];
    cell.textLabel.backgroundColor = [UIColor clearColor];
    return cell;

}

在 CustomCellBackground.m 中

- (void)drawRect:(CGRect)rect
{
    // Drawing code
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGPathRef path = [[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:10.0] CGPath];
    CGContextAddPath(context, path);
    CGContextClip(context);
    //CGContextSetLineJoin(context, kCGLineJoinRound);

    drawLinearGradientWithFourColors(context, self.bounds);

    CGContextSaveGState(context);

    CGContextSetStrokeColorWithColor(context,[UIColor whiteColor].CGColor);
    CGContextSetLineWidth(context, 1.0);
    CGContextAddPath(context, path);
    CGContextStrokePath(context);
    CGContextRestoreGState(context);

   }

void drawLinearGradientWithFourColors(CGContextRef context, CGRect rect)
{
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGFloat locations[] = {0.0, 0.2, 0.5, 1.0};

    CGFloat colors[16] = {
        85/255.0, 85/255.0, 85/255.0, 1.0,
        45/255.0, 45/255.0, 45/255.0, 1.0,
        22/255.0, 22/255.0, 22/255.0, 1.0,
        0, 0, 0, 1.0
    };

    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, 4);

    CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
    CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));

    CGContextSaveGState(context);
    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
    CGContextRestoreGState(context);
    CGGradientRelease(gradient);
    CGColorSpaceRelease(colorSpace);
}

【问题讨论】:

    标签: ios uitableview rounded-corners stroke


    【解决方案1】:

    初始化视图时,为视图和视图的图层设置Opaque 参数。

    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            [self setOpaque:NO];
            [self.layer setOpaque:NO];
        }
        return self;
    }
    

    【讨论】:

      【解决方案2】:

      我用谷歌搜索并粘贴了下面的代码。更多信息请参考link:

      使用下面的代码:

      typedef enum  {
          CustomCellBackgroundViewPositionTop, 
          CustomCellBackgroundViewPositionMiddle, 
          CustomCellBackgroundViewPositionBottom,
          CustomCellBackgroundViewPositionSingle
      } CustomCellBackgroundViewPosition;
      
      @interface CustomCellBackgroundView : UIView {
          UIColor *borderColor;
          UIColor *fillColor;
          CustomCellBackgroundViewPosition position;
      }
      
          @property(nonatomic, retain) UIColor *borderColor, *fillColor;
          @property(nonatomic) CustomCellBackgroundViewPosition position;
      @end
      
      
      - (void)drawRect:(CGRect)rect {
          // Drawing code
          CGContextRef c = UIGraphicsGetCurrentContext();
          CGContextSetFillColorWithColor(c, [fillColor CGColor]);
          CGContextSetStrokeColorWithColor(c, [borderColor CGColor]);
      
          if (position == CustomCellBackgroundViewPositionTop) {
              CGContextFillRect(c, CGRectMake(0.0f, rect.size.height - 10.0f, rect.size.width, 10.0f));
              CGContextBeginPath(c);
              CGContextMoveToPoint(c, 0.0f, rect.size.height - 10.0f);
              CGContextAddLineToPoint(c, 0.0f, rect.size.height);
              CGContextAddLineToPoint(c, rect.size.width, rect.size.height);
              CGContextAddLineToPoint(c, rect.size.width, rect.size.height - 10.0f);
              CGContextStrokePath(c);
              CGContextClipToRect(c, CGRectMake(0.0f, 0.0f, rect.size.width, rect.size.height - 10.0f));
          } else if (position == CustomCellBackgroundViewPositionBottom) {
              CGContextFillRect(c, CGRectMake(0.0f, 0.0f, rect.size.width, 10.0f));
              CGContextBeginPath(c);
              CGContextMoveToPoint(c, 0.0f, 10.0f);
              CGContextAddLineToPoint(c, 0.0f, 0.0f);
              CGContextStrokePath(c);
              CGContextBeginPath(c);
              CGContextMoveToPoint(c, rect.size.width, 0.0f);
              CGContextAddLineToPoint(c, rect.size.width, 10.0f);
              CGContextStrokePath(c);
              CGContextClipToRect(c, CGRectMake(0.0f, 10.0f, rect.size.width, rect.size.height));
          } else if (position == CustomCellBackgroundViewPositionMiddle) {
              CGContextFillRect(c, rect);
              CGContextBeginPath(c);
              CGContextMoveToPoint(c, 0.0f, 0.0f);
              CGContextAddLineToPoint(c, 0.0f, rect.size.height);
              CGContextAddLineToPoint(c, rect.size.width, rect.size.height);
              CGContextAddLineToPoint(c, rect.size.width, 0.0f);
              CGContextStrokePath(c);
              return; // no need to bother drawing rounded corners, so we return
          }
      
          // At this point the clip rect is set to only draw the appropriate
          // corners, so we fill and stroke a rounded rect taking the entire rect
      
          CGContextBeginPath(c);
          addRoundedRectToPath(c, rect, 10.0f, 10.0f);
          CGContextFillPath(c);  
      
          CGContextSetLineWidth(c, 1);  
          CGContextBeginPath(c);
          addRoundedRectToPath(c, rect, 10.0f, 10.0f);  
          CGContextStrokePath(c); 
      }
      
      static void addRoundedRectToPath(CGContextRef context, CGRect rect,
                                      float ovalWidth,float ovalHeight)
      
      {
          float fw, fh;
      
          if (ovalWidth == 0 || ovalHeight == 0) {// 1
              CGContextAddRect(context, rect);
              return;
          }
      
          CGContextSaveGState(context);// 2
      
          CGContextTranslateCTM (context, CGRectGetMinX(rect),// 3
                                 CGRectGetMinY(rect));
          CGContextScaleCTM (context, ovalWidth, ovalHeight);// 4
          fw = CGRectGetWidth (rect) / ovalWidth;// 5
          fh = CGRectGetHeight (rect) / ovalHeight;// 6
      
          CGContextMoveToPoint(context, fw, fh/2); // 7
          CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1);// 8
          CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1);// 9
          CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1);// 10
          CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); // 11
          CGContextClosePath(context);// 12
      
          CGContextRestoreGState(context);// 13
      }
      

      【讨论】:

      • 感谢您的帮助。但我不想遵循这种方法:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多