2013-03-04 6 views
10

मैं निम्न चित्र की तरह देखने के एक ढाल सीमा बनाना चाहते:UIView की ढाल सीमा कैसे बनाएं?

Image

लेकिन मैं नहीं जानता कि कैसे वास्तव में यह करना है, यानी क्या ग्रेडिएंट रंग मैं यह करने के उपयोग करना चाहिए? छवि की तरह सीमा दिखाने के लिए अपना दृश्य कैसे सेट करें?

मैं एक सीमा प्राप्त करने के लिए निम्नलिखित कोड का उपयोग कर रहा:

self.view.layer.borderColor = [UIColor orangeColor].CGColor; 
self.view.layer.borderWidth = 2.0f; 
+0

देखें http://stackoverflow.com/questions/10200814/how-to-set-a-gradient-border-on-uiview?rq=1 – rmaddy

उत्तर

1

का तरीका यहां बताया कोर ग्राफिक्स के साथ यह करना होगा। इसके drawRect: एक ढाल बना सकते हैं और उपरिशायी है कि एक काला सामग्री आयत के साथ एक UIView उपवर्ग बनाएँ और में:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    // Create and draw the gradient 
    UIColor *gradientColorTop = [UIColor orangeColor]; 
    UIColor *gradientColorBottom = [UIColor yellowColor]; 
    NSArray *gradientColors = @[(id) gradientColorTop.CGColor, (id) gradientColorBottom.CGColor]; 
    CGFloat locations[] = {0.1, 0.80}; 

    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)(gradientColors), locations); 

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

    UIBezierPath *gradientBorder = [UIBezierPath bezierPathWithRoundedRect:rect 
    byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(10.0, 10.0)]; 
    [gradientBorder addClip]; 

    CGContextDrawLinearGradient(ctx, gradient, startPoint, endPoint, 0); 

    // Draw the inner content rectangle 
    UIBezierPath *contentPath = [UIBezierPath bezierPathWithRect:CGRectInset(rect, 20.0, 20.0)]; 
    [[UIColor blackColor] setFill]; 
    [contentPath fill]; 

    CGGradientRelease(gradient); 
    CGColorSpaceRelease(colorSpace); 
} 

कि एक परिणाम आप क्या हासिल करने की कोशिश कर रहे हैं के लिए इसी तरह का उत्पादन होगा।

6

यह मैं क्या किया है और यह पूरी तरह से काम किया

extension CALayer { 
    func addGradienBorder(colors:[UIColor],width:CGFloat = 1) { 
     let gradientLayer = CAGradientLayer() 
     gradientLayer.frame = CGRect(origin: CGPointZero, size: self.bounds.size) 
     gradientLayer.startPoint = CGPointMake(0.0, 0.5) 
     gradientLayer.endPoint = CGPointMake(1.0, 0.5) 
     gradientLayer.colors = colors.map({$0.CGColor}) 

     let shapeLayer = CAShapeLayer() 
     shapeLayer.lineWidth = width 
     shapeLayer.path = UIBezierPath(rect: self.bounds).CGPath 
     shapeLayer.fillColor = nil 
     shapeLayer.strokeColor = UIColor.blackColor().CGColor 
     gradientLayer.mask = shapeLayer 

     self.addSublayer(gradientLayer) 
    } 

} 
+0

मैंने देखा कि रंग पैरामीटर एक यूआईसीओलर सरणी है लेकिन डिफ़ॉल्ट मान एक CGColor सरणी है। महान जवाब हालांकि :) – glm4

1

क्रिस्टोस Hadjikyriacou के जवाब का उद्देश्य-सी संस्करण

@implementation CALayer(Border) 

-(void) addGradientBorder { 

CAGradientLayer *gradientLayer = [[CAGradientLayer alloc] init]; 
gradientLayer.frame = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height); 
gradientLayer.startPoint = CGPointMake(0.0, 0.5); 
gradientLayer.endPoint = CGPointMake(1.0, 0.5); 
gradientLayer.colors = @[(id)[UIColor redColor].CGColor, (id)[UIColor blueColor].CGColor]; 

CAShapeLayer *shapeLayer =[[CAShapeLayer alloc] init]; 
shapeLayer.lineWidth = 0.5; 
shapeLayer.path = [UIBezierPath bezierPathWithRect:self.bounds].CGPath; 
shapeLayer.fillColor = nil; 
shapeLayer.strokeColor = [UIColor blackColor].CGColor; 
gradientLayer.mask = shapeLayer; 
[self addSublayer : gradientLayer]; 
} 
@end 
3

आप देख सकते हैं और कोने की त्रिज्या (अगर आप चाहते हैं) की ढाल सीमा कर सकते हैं का उपयोग कर यह -

self.yourView.layer.cornerRadius=4; 

self.yourView.layer.masksToBounds=YES; 

CAGradientLayer *gradient = [CAGradientLayer layer]; 

gradient.frame = self.yourView.bounds; 

gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:255/255.0 green:226/255.0 blue:138/255.0 alpha:1.0] CGColor], (id)[[UIColor colorWithRed:255/255.0 green:198/255.0 blue:91/255.0 alpha:0.9] CGColor],(id)[[UIColor colorWithRed:255/255.0 green:226/255.0 blue:138/255.0 alpha:1.0] CGColor], nil]; 

gradient.startPoint = CGPointMake(0.0, 0.0); 

gradient.endPoint = CGPointMake(1, 1); 

CAShapeLayer *shapeLayer =[[CAShapeLayer alloc] init]; 

shapeLayer.lineWidth = 15; // higher number higher border width 

shapeLayer.path = [UIBezierPath bezierPathWithRect:self.yourView.bounds].CGPath; 

shapeLayer.fillColor = nil; 

shapeLayer.strokeColor = [UIColor blackColor].CGColor; 

gradient.mask = shapeLayer; 

[self.yourView.layer insertSublayer:gradient atIndex:0]; 

इससे आपकी मदद मिलेगी! धन्यवाद

+1

यह समाधान लगभग मेरे लिए काम कर रहा है, लेकिन सीमा को काट दिया जा रहा है जहां कोनों को गोलाकार किया जाता है। कोई विचार यह सुनिश्चित करने के लिए कि सीमा कोनों के चारों ओर कैसे जाता है? –

+3

इसे विधि '[UIBezierPath bezierPathWithRoundedRect: self.layer.bounds cornerRadius: ] का उपयोग करके मिला। .CGPath' मैंने इसे UIView पर क्लास एक्सटेंशन विधि के रूप में सेट किया है, इसलिए' self.layer.bounds'। –

संबंधित मुद्दे