3

我知道向 UIView 添加背景渐变的几种方法。我想知道这样做最有效和可扩展的方式是什么,为什么?以下是我使用的技术:

  • 创建 UIView 的子视图并覆盖 drawRect,我在当前上下文中绘制渐变。

    一个。当使用上面的渐变创建它的边界我想装饰和插入这个背景渐变作为第一个子视图,即– insertSubview:atIndex:

    湾。从上面得到背景渐变视图后,我在图像上下文中渲染它并将其用作背景图像,即

    UIGraphicsBeginImageContext(gradView.bounds.size);
    [gradView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *gradientImg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIColor *background = [UIColor colorWithPatternImage:gradientImg];
    self.view.backgroundColor = 背景;
    
  • 创建可拉伸的 PNG 并使用它来装饰视图背景。技术与您装饰 UIButton 的方式非常相似。

    -(UIColor *)backgroundColor:(CGRect)frame
    {
        UIImage *bg = [UIImage imageNamed:@"background_23x36"];
        bg = [bg resizableImageWithCapInsets:UIEdgeInsetsMake(0.0, 11.0, 0.0, 11.0)];
        UIGraphicsBeginImageContextWithOptions(frame.size, YES, [[UIScreen mainScreen] scale]);
        [bg drawInRect:frame];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        返回 [UIColor colorWithPatternImage:image];
    }
    
  • 创建 UIView 的子视图,但不要覆盖 drawRect,而是使用 CAGradientLayer。类似于http://nscookbook.com/2013/04/recipe-20-using-cagradient-layer-in-a-custom-view/

那么添加渐变作为背景的最有效和可扩展的方法是什么?

4

2 回答 2

9

正如 Fogmeister 上面建议的那样,在drawRect:您的子类的方法中执行此操作UIView

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

    NSArray *gradientColors = [NSArray arrayWithObjects:(id) [UIColor redColor].CGColor, [UIColor yellowColor].CGColor, nil];

    CGFloat gradientLocations[] = {0, 0.50, 1};
    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) gradientColors, gradientLocations);

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

    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
    CGGradientRelease(gradient);
    CGColorSpaceRelease(colorSpace);
}
于 2013-04-12T20:43:43.250 回答
0

DrawRect 是我认为更有效的方式。我想扩展 jverrijt 的好答案。如果你需要 alpha 分量(透明到黑色渐变 fe),那么你可以使用这个:

UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0);
CGContextSaveGState(UIGraphicsGetCurrentContext());
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
CGContextRestoreGState(UIGraphicsGetCurrentContext());

//Draw stuffs

UIGraphicsEndImageContext();
于 2013-04-12T21:03:32.923 回答