2013-04-14 13 views
9

Rozglądałem się wszędzie, ale nie mogę znaleźć sposobu, aby to zrobić. Potrzebuję utworzyć czarną maskę UII o określonej szerokości i wysokości (zmiana szerokości i wysokości, więc nie mogę po prostu utworzyć czarnego pola, a następnie załadować go do UII). Czy jest jakiś sposób, aby zrobić CGRect, a następnie przekonwertować go do UIImage? Czy jest jakiś inny sposób na zrobienie prostego czarnego pudełka?Jak utworzyć czarną UIImage?

+1

Jeśli wystarczy czarną skrzynkę, utwórz 'UIView' użyciem' CGRect' dla 'frame' ustaw' backgroundColor' do '[UIColor blackColor]', a następnie dodać to nowe "UIView" do istniejącego widoku (np. 'self.view', jeśli robi to z kontrolera), używając' addSubview'. – Rob

+0

Ściśle związane: [Dla pokosów kolorów, które są tańsze, UIView lub UIImage?] (Http://stackoverflow.com/q/13885588) Zobacz też: [Nakładanie UIImage z kolorem] (http: // stackoverflow. com/q/845278), która ma [odpowiedź] (http://stackoverflow.com/a/10620128/603977), która mówi ci, jak zrobić to, o co prosisz. –

Odpowiedz

22

W zależności od sytuacji prawdopodobnie można użyć zestawu UIView z zestawem backgroundColor na [UIColor blackColor]. Ponadto, jeśli obraz jest mocno zabarwiony, nie potrzebujesz obrazu, który w rzeczywistości jest wymiarami, na których chcesz go wyświetlać; możesz przeskalować obraz w pikselach 1x1 w celu wypełnienia wymaganej przestrzeni (np. ustawiając contentMode z UIImageView na UIViewContentModeScaleToFill).

Mimo, że może to być pouczające, aby zobaczyć, jak faktycznie wygenerować taki obraz:

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(); 

Teraz im jest obraz.

Ten kod pochodzi prawie niezmieniony od tej części mojej książki: http://www.apeth.com/iOSBook/ch15.html#_graphics_contexts

+0

Solidne. Jedyne co zmienię to to, że 'opaque' może być ustawione na' YES', ponieważ przypuszczalnie rysujemy nieprzezroczysty kolor w kontekście. – warrenm

+0

Właściwie jeśli ustawisz 'opaque' na YES, nie musisz nawet narysować prostokąta wypełnionego czarnym kolorem! :) Nieprzezroczysty kontekst graficzny * jest * czarny. – matt

+0

Dobry połów. Zastanawiam się, czy jest to udokumentowane gdziekolwiek lub czy jest to tylko dziwactwo realizacji. – 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

Oto przykład, który tworzy czarną UIImage który jest 1920x1080, tworząc go od CGImage utworzonego z 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)