Сделать фон UIView gradleиентом без подclassа

Есть ли способ сделать фон UIView gradleиентом без его подclassификации? Я бы предпочел не использовать файл изображения для этого. Мне просто кажется, что нужно подclassифицировать UIView только для рисования gradleиента для фона.

Вы можете использовать +[UIColor colorWithPatternImage:] чтобы создать узорный фон. Пример (введите собственный CGGradient):

 // Allocate color space CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); // Allocate bitmap context CGContextRef bitmapContext = CGBitmapContextCreate(NULL, 320, 480, 8, 4 * 320, colorSpace, kCGImageAlphaNoneSkipFirst); //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); // Draw Gradient Here CGContextDrawLinearGradient(bitmapContext, myGradient, CGPointMake(0.0f, 0.0f), CGPointMake(320.0f, 480.0f), 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:image]]; 

Вероятно, проще будет просто создать подclass UIView . Он будет использовать меньше памяти.

Вы можете сделать:

 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.3:

 let gradient = CAGradientLayer() gradient.frame = view.bounds gradient.colors = [UIColor.redColor().CGColor, UIColor.whiteColor().CGColor] 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) 

Обязательно добавьте структуру QuartzCore в свой проект.

 #import  

Я согласен с rpetrich, было бы проще просто сделать подclass UIView. Пример того, как это сделать, см. В моем ответе в этом вопросе . Если бы вы захотели, вы могли бы создать общий подclass UIView gradleиента и просто поместить его за представления, которые вы хотите использовать для фона gradleиента.

Я меняю принятый ответ на мое издание

 +(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; } 
Давайте будем гением компьютера.