Iphone 将UIView的背景设置为渐变而不进行子分类

Iphone 将UIView的背景设置为渐变而不进行子分类,iphone,uiview,subclass,Iphone,Uiview,Subclass,有没有一种方法可以使UIView的背景成为渐变,而无需对其进行子类化?我也不希望使用图像文件来实现这一点。只需为背景绘制渐变,就必须将UIView子类化,这似乎很迟钝。您可以使用+[uicolorWithPatternImage:生成带图案的背景。示例(带上您自己的CGGradient): 不过,创建UIView子类可能会更简单。它也将使用更少的内存。我同意rpetrich,只做UIView子类会更干净。有关如何执行此操作的示例,请参阅。如果您愿意,您可以创建一个通用的gradient UIVi

有没有一种方法可以使UIView的背景成为渐变,而无需对其进行子类化?我也不希望使用图像文件来实现这一点。只需为背景绘制渐变,就必须将UIView子类化,这似乎很迟钝。

您可以使用
+[uicolorWithPatternImage:
生成带图案的背景。示例(带上您自己的CGGradient):


不过,创建
UIView
子类可能会更简单。它也将使用更少的内存。

我同意rpetrich,只做UIView子类会更干净。有关如何执行此操作的示例,请参阅。如果您愿意,您可以创建一个通用的gradient UIView子类,并简单地将其放置在您希望具有渐变背景的视图后面。

我将采用的答案更改为我的版本

+(void) setBlackGradientToView:(UIView*)targetView
{
    CGRect frame = targetView.frame;
    // Allocate color space
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    //allocate myGradient
    CGFloat locationList[]  = {0.0f, 1.0f};
    CGFloat colorList[]     = {0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f};
    CGGradientRef myGradient   = CGGradientCreateWithColorComponents(colorSpace, colorList, locationList, 2);
    // Allocate bitmap context
    CGContextRef bitmapContext = CGBitmapContextCreate(NULL, frame.size.width, frame.size.height, 8, 4 * frame.size.width, colorSpace, kCGImageAlphaPremultipliedLast);
    //Draw Gradient Here
    CGContextDrawLinearGradient(bitmapContext, myGradient, CGPointMake(0.0f, 0.0f), CGPointMake(0, frame.size.height), 0);
    // Create a CGImage from context
    CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext);
    // Create a UIImage from CGImage
    UIImage *uiImage = [UIImage imageWithCGImage:cgImage];
    // Release the CGImage
    CGImageRelease(cgImage);
    // Release the bitmap context
    CGContextRelease(bitmapContext);
    // Release the color space
    CGColorSpaceRelease(colorSpace);

    //Create the patterned UIColor and set as background color
    [targetView setBackgroundColor:[UIColor colorWithPatternImage:uiImage]];
    //return uiImage;
}
你可以做:

Swift>=4.0:

let gradient = CAGradientLayer()
gradient.frame = view.bounds
gradient.colors = [UIColor.red.cgColor, UIColor.white.cgColor]
view.layer.insertSublayer(gradient, at: 0)
let gradient = CAGradientLayer()
gradient.frame = view.bounds
gradient.colors = [UIColor.red().cgColor, UIColor.white().cgColor]
view.layer.insertSublayer(gradient, at: 0)
let gradient = CAGradientLayer()
gradient.frame = view.bounds
gradient.colors = [UIColor.redColor().CGColor, UIColor.whiteColor().CGColor]
view.layer.insertSublayer(gradient, atIndex: 0)
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.view.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor redColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
[self.view.layer insertSublayer:gradient atIndex:0];
Swift 3.0:

let gradient = CAGradientLayer()
gradient.frame = view.bounds
gradient.colors = [UIColor.red.cgColor, UIColor.white.cgColor]
view.layer.insertSublayer(gradient, at: 0)
let gradient = CAGradientLayer()
gradient.frame = view.bounds
gradient.colors = [UIColor.red().cgColor, UIColor.white().cgColor]
view.layer.insertSublayer(gradient, at: 0)
let gradient = CAGradientLayer()
gradient.frame = view.bounds
gradient.colors = [UIColor.redColor().CGColor, UIColor.whiteColor().CGColor]
view.layer.insertSublayer(gradient, atIndex: 0)
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.view.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor redColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
[self.view.layer insertSublayer:gradient atIndex:0];

Swift第#2行出现内存泄漏,无法发布cgColorSpaceCreateDeviceGB()良好实现的结果。但有一个问题是,新的视网膜显示设备是否能起作用?(我看到320x480在那里是硬编码的)@chakrit,它仍然可以与视网膜设备一起工作,但只能以1x分辨率渲染渐变;取决于可能足够的坡度。320x480是硬编码的,以使示例更简单–最好使用实际视图大小。@AlexanderPerechnev这是一个
CGGradientRef
,您可以使用
CGGradientCreateWithColor
/
CGGradientCreateWithColorComponents
创建,谢谢。光滑如丝般当我使用这段代码时,我得到了类似于架构i386未定义符号的错误:“\u OBJC\u CLASS\u$\ u CAGradientLayer”,引用自:@VinothKumar add
\35; import
我写了这个“cellForRowAtIndexPath”,这样我可以在每个单元格中显示渐变视图,它工作正常,现在我面临一个问题,同时我上下滚动,渐变颜色越来越暗。如何解决这个问题?@jithin我会用你正在使用的代码发布一个问题。我认为您每次都在添加图层,并且它被tableView重用,因此每次都会使其颜色更深