2013-04-14 17 views
9

Mi sono guardato in giro dappertutto, ma non riesco a trovare un modo per farlo. Ho bisogno di creare una UII nera di una certa larghezza e altezza (la larghezza e l'altezza cambiano, quindi non posso semplicemente creare una scatola nera e poi caricarla in una UIImmagine). C'è un modo per creare un CGRect e poi convertirlo in un UIImage? O c'è un altro modo per creare una semplice scatola nera?Come creare un UIImage nero?

+1

Se avete solo bisogno di una scatola nera, creare un 'UIView' di utilizzare il' CGRect' per il 'trama fissa, impostare il' backgroundColor' a '[UIColor blackcolor]', e quindi aggiungerequesto nuovo 'UIView' alla tua vista esistente (ad es. 'self.view' se si fa questo da un controller), usando' addSubview'. – Rob

+0

Strettamente correlato: [per strisce di colore, che è più economico, UIView o UIImage?] (Http://stackoverflow.com/q/13885588) Vedi anche: [Sovrapposizione di una UIImmagine con un colore] (http: // StackOverflow. it/q/845278), che ha [una risposta] (http://stackoverflow.com/a/10620128/603977) che ti dice come fare ciò che stai chiedendo. –

risposta

22

A seconda della situazione, è probabile che sia possibile utilizzare semplicemente un UIView con il backgroundColor impostato su [UIColor blackColor]. Inoltre, se l'immagine è a tinta unita, non è necessaria un'immagine che sia in realtà le dimensioni in cui desideri visualizzarla; puoi semplicemente ridimensionare un'immagine di 1x1 pixel per riempire lo spazio necessario (ad esempio impostando contentMode di UIImageView in UIViewContentModeScaleToFill).

Detto questo, può essere istruttivo vedere come generare in realtà una tale immagine:

CGSize imageSize = CGSizeMake(64, 64); 
UIColor *fillColor = [UIColor blackColor]; 
UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
[fillColor setFill]; 
CGContextFillRect(context, CGRectMake(0, 0, imageSize.width, imageSize.height)); 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
6
UIGraphicsBeginImageContextWithOptions(CGSizeMake(w,h), NO, 0); 
UIBezierPath* p = 
    [UIBezierPath bezierPathWithRect:CGRectMake(0,0,w,h)]; 
[[UIColor blackColor] setFill]; 
[p fill]; 
UIImage* im = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Ora im è l'immagine.

Che il codice proviene quasi invariato da questa sezione del mio libro: http://www.apeth.com/iOSBook/ch15.html#_graphics_contexts

+0

Solido. L'unica cosa che cambierei è che 'opaque' può essere impostato su' YES' dal momento che stiamo presumibilmente disegnando un colore opaco nel contesto. – warrenm

+0

In realtà se si imposta 'opaque' su SÌ, penso che non sia nemmeno necessario disegnare il rettangolo nero pieno! :) Un contesto grafico opaco * è * nero. – matt

+0

Buona presa. Mi chiedo se questo è documentato ovunque o se si tratta solo di un capriccio di implementazione. – warrenm

2

Swift 3:

func uiImage(from color:UIColor?, size:CGSize) -> UIImage? { 

    UIGraphicsBeginImageContextWithOptions(size, true, 0) 
    defer { 
     UIGraphicsEndImageContext() 
    } 

    let context = UIGraphicsGetCurrentContext() 
    color?.setFill() 
    context?.fill(CGRect.init(x: 0, y: 0, width: size.width, height: size.height)) 
    return UIGraphicsGetImageFromCurrentImageContext() 
} 
0

Ecco un esempio che crea un UIImage nero che è 1920x1080 con la creazione da un CGImage creato da un CIImage:

let frame = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 1920, height: 1080)) 
let cgImage = CIContext().createCGImage(CIImage(color: .black()), from: frame)! 
let uiImage = UIImage(cgImage: cgImage)