代码之家  ›  专栏  ›  技术社区  ›  runmad

带渐变色的圆形矩形

  •  6
  • runmad  · 技术社区  · 16 年前

    - (void)drawRect:(CGRect)rect {
        CGContextRef currentContext = UIGraphicsGetCurrentContext();
    
        CGGradientRef glossGradient;
        CGColorSpaceRef rgbColorspace;
        size_t num_locations = 2;
        CGFloat locations[2] = { 0.0, 1.0 };
        CGFloat components[8] = { 1.0, 1.0, 1.0, 0.95,  // Start color
                                1.0, 1.0, 1.0, 0.60 }; // End color
    
        rgbColorspace = CGColorSpaceCreateDeviceRGB();
        glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);
    
        CGRect currentBounds = self.bounds;
        CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 0.0f);
        CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMaxY(currentBounds));
        CGContextDrawLinearGradient(currentContext, glossGradient, topCenter, midCenter, 0);
    
        CGGradientRelease(glossGradient);
        CGColorSpaceRelease(rgbColorspace);
    }
    

    我不确定在drawRect方法中应该舍入到哪里。谢谢

    2 回复  |  直到 10 年前
        1
  •  7
  •   Community Mohan Dere    9 年前

    你看过以前的问题帖子了吗?我不久前读过一篇关于掩蔽视图的文章。我认为这同样适用于所有使用drawRect的对象

    How to mask a square image into an image with round corners in the iPhone SDK?


    这就是我所做的,据我所知,它工作得很好。

    首先,我借了Mr NilObject 上面提到的文章中的代码片段。

    我修改了它以适合对象(因为他将其作为C函数而不是方法编写)

    所以基本上:

    • 设置透明背景(在init中),否则剪辑会很糟糕
    • 在drawRect中,首先剪辑,然后在剪辑区域内绘制

    //
    //  TeleView.m
    //
    
    #import "TeleView.h"
    
    
    @implementation TeleView
    /**** in init methods, set background to transparent,
          otherwise, clipping shows a black background ****/
    
    - (id) initWithFrame:(CGRect)frame {
        if((self = [super initWithFrame:frame])) {
            [self setBackgroundColor:[UIColor colorWithWhite:0.0f alpha:0.0f]];
        }
        return self;
    }
    - (void) clipCornersToOvalWidth:(float)ovalWidth height:(float)ovalHeight
    {
        float fw, fh;
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGRect rect = CGRectMake(0.0f, 0.0f, self.frame.size.width, self.frame.size.height);
    
        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, 1);
        CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1);
        CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1);
        CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1);
        CGContextClosePath(context);
        CGContextRestoreGState(context);
    }
    
    -(void)drawRect:(CGRect)rect {
        CGContextRef currentContext = UIGraphicsGetCurrentContext();
        /**** here is what I modified. ****/
        [self clipCornersToOvalWidth:20.0f height:20.0f];
        CGContextClip(currentContext);
    
        /**** below this is your own code ****/
        CGGradientRef glossGradient;
        CGColorSpaceRef rgbColorspace;
        size_t num_locations = 2;
        CGFloat locations[2] = { 0.0, 1.0 };
        CGFloat components[8] = { 1.0, 0.0, 0.0, 0.60,  // Start color
        0.0, 1.0, 0.0, 0.40 }; // End color
    
        rgbColorspace = CGColorSpaceCreateDeviceRGB();
        glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);
    
        CGRect currentBounds = self.bounds;
        CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 0.0f);
        CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMaxY(currentBounds));
        CGContextDrawLinearGradient(currentContext, glossGradient, topCenter, midCenter, 0);
    
        CGGradientRelease(glossGradient);
        CGColorSpaceRelease(rgbColorspace); 
    
    }
    
    @end
    
        2
  •  7
  •   Shaffiulla Khan    13 年前
    NSArray *colors = [NSArray arrayWithObjects:fromColor.CGColor,toColor.CGColor, nil];
    
    NSNumber *stopOne = [NSNumber numberWithFloat:0.0];
    NSNumber *stopTwo = [NSNumber numberWithFloat:1.0];
    
    NSArray *locations = [NSArray arrayWithObjects:stopOne, stopTwo, nil];
    
    CAGradientLayer *headerLayer = [CAGradientLayer layer];
    headerLayer.colors = colors;
    headerLayer.locations = locations;
    
    headerLayer.borderColor = borderColor.CGColor; // border line color**strong text**
    headerLayer.borderWidth = width;// For Thickness of border line
    headerLayer.cornerRadius = radius;//For Rounded Corner if You want to make rounded Corner
    
    headerLayer.frame = frame;
    
    [view.layer  insertSublayer:headerLayer atIndex:0];
    

    还要确保导入“QuartzCore”框架