2010-10-06 10 views
9

Ich habe eine UIImageView mit zig Millionen Ansichten. Einige dieser Ansichten haben Ebenenschatten oder Glühen. Diese Ansicht ist etwas größer als der Gerätebildschirm.iPhone - Verflachung eines UIImageView und Subviews zu image = leeres Bild

Diese Ansicht ist im Grunde eine große transparente Ansicht, die viele Objekte (Bilder, Buttons, etc.)

Jetzt möchte ich eine UIImage auf dieser Ansicht glätten alles enthält. Dann mache ich:

UIGraphicsBeginImageContext([viewWithZillionsOfObjects bounds].size); 
[[viewWithZillionsOfObjects layer] renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Ergebnis ist gleich einem völlig transparenten Bild, hat aber die richtige Größe.

vermisse ich etwas?

dank

+0

Dieser Code funktioniert: http://stackoverflow.com/questions/3129352/need-to-capture-uiview-into-a-uiimage-including-all-subviews – AlexeyVMP

+0

Dieser Kern wirklich funktioniert: http://stackoverflow.com/questions/3129352/need-to-capture-uiview-into-a-uiimage-including-all-subviews – AlexeyVMP

Antwort

19

In Apple-Beispielcode, stellen sie die Geometrie des Kontextes Grafiken vor dem Aufruf renderInContext: die Geometrie der Schicht anzupassen.

Sie haben es mit einem Fenster zu tun, aber es sieht so aus, als ob der Code mit jeder Ansicht mit einigen kleineren Änderungen funktionieren sollte.

Ich habe nicht versucht, dies zu bauen, aber hier ist mein Versuch, Apples Code zu ändern, um auf jeder Ansicht zu arbeiten.

+0

was ich brauche ist nicht gerade ein Screenshot ... oder Rendern eines Fensters, weil ich rendern muss speziell was ist auf eine Sicht und nicht in allen. Ich habe erwartet, dass die Layer-Eigenschaft alles enthält, was auf einer bestimmten UIView sichtbar ist, aber seltsamerweise nicht. Vielen Dank. – SpaceDog

+0

Ich denke, dass Sie den Code ändern können, um nur auf der Ansicht zu arbeiten, die Sie möchten. Die Fensterbits sind zufällig. –

+0

Ich habe den Code für jede Ansicht enthalten. –

0

Hier ist eine allgemeine Version (Swift 2.x), um ein Array von UIViews zu einem einzigen UIImage zu reduzieren. In Ihrem Fall übergeben Sie einfach ein Array, das aus einer einzigen UIView besteht, und es sollte funktionieren.

// Flattens <allViews> into single UIImage 
func flattenViews(allViews: [UIView]) -> UIImage? { 
    // Return nil if <allViews> empty 
    if (allViews.isEmpty) { 
     return nil 
    } 

    // If here, compose image out of views in <allViews> 
    // Create graphics context 
    UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, UIScreen.mainScreen().scale) 
    let context = UIGraphicsGetCurrentContext() 
    CGContextSetInterpolationQuality(context, CGInterpolationQuality.High) 

    // Draw each view into context 
    for curView in allViews { 
     curView.drawViewHierarchyInRect(curView.frame, afterScreenUpdates: false) 
    } 

    // Extract image & end context 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    // Return image 
    return image 
}