2012-08-08 14 views
20

Obecnie pracuję nad prostą aplikacją typu photoshop na iPhone'a. Kiedy chcę spłaszczyć moje warstwy, etykiety są na dobrej pozycji, ale ze złym rozmiarem czcionki. Oto mój kod spłaszczyć:Jak utworzyć obraz z UILabel?

UIGraphicsBeginImageContext(CGSizeMake(widthDocument,widthDocument)); 

for (UILabel *label in arrayLabel) { 
    [label drawTextInRect:label.frame]; 
} 

UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Ktoś może mi pomóc?

Odpowiedz

38

Od: pulling an UIImage from a UITextView or UILabel gives white image.

// iOS

- (UIImage *)grabImage { 
    // Create a "canvas" (image context) to draw in. 
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0.0); // high res 
    // Make the CALayer to draw in our "canvas". 
    [[self layer] renderInContext: UIGraphicsGetCurrentContext()]; 

    // Fetch an UIImage of our "canvas". 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

    // Stop the "canvas" from accepting any input. 
    UIGraphicsEndImageContext(); 

    // Return the image. 
    return image; 
} 

// Swift rozszerzenie w/użytkowania. kredyt @Heberti Almeida w komentarzach poniżej

extension UIImage { 
    class func imageWithLabel(label: UILabel) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0) 
     label.layer.renderInContext(UIGraphicsGetCurrentContext()!) 
     let img = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return img 
    } 
} 

Wykorzystanie:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 30, height: 22)) 
label.text = bulletString 
let image = UIImage.imageWithLabel(label) 
+0

Tak, widziałem ten post, ale dzięki temu rozwiązaniu nie mogę uzyskać pliku wysokiej rozdzielczości. Ale sprawiłeś, że zrozumiałem, gdzie jest mój problem! Dziękuję bardzo! – Jonathan

+6

@DJPlayer Aby uzyskać ostry obraz dla wyświetlacza Retina, musimy zastąpić pierwszą linię w twojej metodzie następującą linią: 'UIGraphicsBeginImageContextWithOptions (self.bounds.size, self.opaque, 0.0);' jak widać w [to pytanie] (http://stackoverflow.com/q/4334233/2471006) i jego zaakceptowana odpowiedź. Być może warto zaktualizować swoją odpowiedź, w tym te informacje. – anneblue

+0

@anneblue dzięki! – nemesis

5

trzeba renderowania etykiety w kontekście

zastąpić

[label drawTextInRect:label.frame]; 

z

[label.layer renderInContext:UIGraphicsGetCurrentContext()]; 

i trzeba będzie utworzyć jeden obraz na etykiecie, więc przenieść do pętli na zewnątrz początek i koniec kontekście wzywa

1

Można użyć renderInContext na dowolnym CALayer. Narysuje warstwę twojego widoku w kontekście. Aby można było go zmienić na obraz. Również, jeśli robisz renderInContext w widoku, wszystkie jego widoki będą rysowane w kontekście. Zamiast więc powtarzać wszystkie etykiety, dodając etykiety, możesz je dodać do containerView. I po prostu trzeba wykonać renderInContext na tym containerView.

12

Stworzyłem Swift rozszerzenie do renderowania UILabel w UIImage:

extension UIImage { 
    class func imageWithLabel(label: UILabel) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0) 
     label.layer.renderInContext(UIGraphicsGetCurrentContext()!) 
     let img = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return img 
    } 
} 

EDIT: Poprawiona Swift 4 wersji

extension UIImage { 
    class func imageWithLabel(_ label: UILabel) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0) 
     defer { UIGraphicsEndImageContext() } 
     label.layer.render(in: UIGraphicsGetCurrentContext()!) 
     return UIGraphicsGetImageFromCurrentImageContext() ?? UIImage() 
    } 
} 

Użycie jest proste:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 30, height: 22)) 
label.text = bulletString 
let image = UIImage.imageWithLabel(label) 
+1

Ty mój dobry panie jesteś prawdziwym bohaterem! – rilar

+0

^^ Co on powiedział ^^ – bkwebhero

1

dla Swift Używam tego rozszerzenia UIView:

// Updated for Swift 3.0 
extension UIView { 
    var grabbedImage:UIImage? { 
     get { 
      UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0.0) 
      layer.render(in: UIGraphicsGetCurrentContext()!) 
      let img = UIGraphicsGetImageFromCurrentImageContext() 
      UIGraphicsEndImageContext() 
      return img 
     } 
    } 
} 
Powiązane problemy