2014-10-02 10 views
6

Używam programu PaintCode i wygenerowałem kod do utworzenia kształtu z nałożonym tekstem. Chcę użyć tego kodu do przeanalizowania ciągu znaków i wygenerowania UIImage, które można zapisać do rolki aparatu lub udostępnić na FB, ale staram się wygenerować UIImage. Każda pomoc będzie świetna!Cel C - Utwórz obiekt UII z tego kodu PaintCode

Oto kod:

- (void)drawShareImageWithText: (NSString*)text; 
{ 
//// Color Declarations 
UIColor* questionText = [UIColor colorWithRed: 1 green: 1 blue: 1 alpha: 1]; 

//// Bezier Drawing 
UIBezierPath* bezierPath = UIBezierPath.bezierPath; 
[bezierPath moveToPoint: CGPointMake(42.46, 0.09)]; 
[bezierPath addCurveToPoint: CGPointMake(53.37, 11) controlPoint1: CGPointMake(42.46, 0.09) controlPoint2: CGPointMake(47.66, 5.3)]; 
[bezierPath addLineToPoint: CGPointMake(255.6, 11)]; 
[bezierPath addCurveToPoint: CGPointMake(267.62, 11.92) controlPoint1: CGPointMake(261.76, 11) controlPoint2: CGPointMake(264.84, 11)]; 
[bezierPath addLineToPoint: CGPointMake(268.16, 12.05)]; 
[bezierPath addCurveToPoint: CGPointMake(275.95, 19.84) controlPoint1: CGPointMake(271.78, 13.37) controlPoint2: CGPointMake(274.63, 16.22)]; 
[bezierPath addCurveToPoint: CGPointMake(277, 32.4) controlPoint1: CGPointMake(277, 23.16) controlPoint2: CGPointMake(277, 26.24)]; 
[bezierPath addLineToPoint: CGPointMake(277, 148.6)]; 
[bezierPath addCurveToPoint: CGPointMake(276.08, 160.62) controlPoint1: CGPointMake(277, 154.76) controlPoint2: CGPointMake(277, 157.84)]; 
[bezierPath addLineToPoint: CGPointMake(275.95, 161.16)]; 
[bezierPath addCurveToPoint: CGPointMake(268.16, 168.95) controlPoint1: CGPointMake(274.63, 164.78) controlPoint2: CGPointMake(271.78, 167.63)]; 
[bezierPath addCurveToPoint: CGPointMake(255.6, 170) controlPoint1: CGPointMake(264.84, 170) controlPoint2: CGPointMake(261.76, 170)]; 
[bezierPath addLineToPoint: CGPointMake(21.4, 170)]; 
[bezierPath addCurveToPoint: CGPointMake(9.38, 169.08) controlPoint1: CGPointMake(15.24, 170) controlPoint2: CGPointMake(12.16, 170)]; 
[bezierPath addLineToPoint: CGPointMake(8.84, 168.95)]; 
[bezierPath addCurveToPoint: CGPointMake(1.05, 161.16) controlPoint1: CGPointMake(5.22, 167.63) controlPoint2: CGPointMake(2.37, 164.78)]; 
[bezierPath addCurveToPoint: CGPointMake(0, 148.6) controlPoint1: CGPointMake(0, 157.84) controlPoint2: CGPointMake(0, 154.76)]; 
[bezierPath addLineToPoint: CGPointMake(0, 32.4)]; 
[bezierPath addCurveToPoint: CGPointMake(0.92, 20.38) controlPoint1: CGPointMake(0, 26.24) controlPoint2: CGPointMake(0, 23.16)]; 
[bezierPath addLineToPoint: CGPointMake(1.05, 19.84)]; 
[bezierPath addCurveToPoint: CGPointMake(8.84, 12.05) controlPoint1: CGPointMake(2.37, 16.22) controlPoint2: CGPointMake(5.22, 13.37)]; 
[bezierPath addCurveToPoint: CGPointMake(21.4, 11) controlPoint1: CGPointMake(12.16, 11) controlPoint2: CGPointMake(15.24, 11)]; 
[bezierPath addLineToPoint: CGPointMake(31.54, 11)]; 
[bezierPath addCurveToPoint: CGPointMake(42.46, 0.09) controlPoint1: CGPointMake(37.25, 5.3) controlPoint2: CGPointMake(42.46, 0.09)]; 
[bezierPath closePath]; 
[StyleKit.Color1 setFill]; 
[bezierPath fill]; 


//// shareContent Drawing 
CGRect shareContentRect = CGRectMake(15, 26, 247, 136.03); 
NSMutableParagraphStyle* shareContentStyle = NSMutableParagraphStyle.defaultParagraphStyle.mutableCopy; 
shareContentStyle.alignment = NSTextAlignmentCenter; 

NSDictionary* shareContentFontAttributes = @{NSFontAttributeName: [UIFont fontWithName: @"Helvetica" size: 15], NSForegroundColorAttributeName: questionText, NSParagraphStyleAttributeName: shareContentStyle}; 

[text drawInRect: CGRectOffset(shareContentRect, 0, (CGRectGetHeight(shareContentRect) - [text boundingRectWithSize: shareContentRect.size options: NSStringDrawingUsesLineFragmentOrigin attributes: shareContentFontAttributes context: nil].size.height)/2) withAttributes: shareContentFontAttributes]; 
} 
+0

których farba kod wersja U R użyciu? – harshitgupta

+0

Mam PaintCode v2 – mwiggs

+0

następnie wierzę, że powinienem być w stanie to zrobić. Zapewnia także funkcje pozwalające uzyskać obraz oprócz kodu CGRect. zapoznaj się z tym tutorialem https://www.youtube.com/watch?v=QLoJrgVg8Ok#t=375 za pomocą metod i zmiennych obrazu, które otrzymasz: – harshitgupta

Odpowiedz

7

Wszystko to kod rysowania zostanie wygenerowany w oczekiwaniu, że będzie on prowadzony w kontekście graficznym stworzonym i zarządzanym przez UIKit.

Jest to automatycznie przypadek w ramach metody UIView: drawRect. Ale chcesz wygenerować UIImage, więc musisz skonfigurować tymczasowy kontekst graficzny właśnie do tego.

Ogólne podejście jest następujące: książka

// specify size of the image 
CGRect imageRect = CGRectMake(0,0,100,100); 
// create the graphics context 
UIGraphicsBeginImageContextWithOptions(imageRect.size,NO,0.0); 
// insert calls to your drawing code here, to draw into the context 
// ... 
// save the image from the implicit context into an image 
UIImage * finalImage = UIGraphicsGetImageFromCurrentImageContext(); 
// cleanup 
UIGraphicsEndImageContext(); 

Erica Sadun w sprawie praktycznej UIKit rysunku jest prawdopodobnie jednym z najlepszych, gdzie realizowane są tego rodzaju rzeczy.

Odpowiednik w Swift (wersja językowa 1.2):

// specify size of the image 
let imageRect:CGRect = CGRectMake(0,0,100,100) 
// create the graphics context 
UIGraphicsBeginImageContextWithOptions(imageRect.size, false, 0) 
// insert calls to your drawing code here, to draw into the context 
// ... 
// save the image from the implicit context into an image 
let finalImage = UIGraphicsGetImageFromCurrentImageContext() 
// cleanup 
UIGraphicsEndImageContext() 
+0

Dziękuję za wyjaśnienie tego. To dobrze działa! – mwiggs

+0

Dzięki temu jest świetnie. PaintCode nie jest tak naprawdę plug-and-play. – n13

+0

Powiedziałbym, że PaintCode jest bardzo pomocnym narzędziem do nauki CoreGraphics lub przyspieszenia pracy z CoreGraphics, ale trudno mi wyobrazić sobie sytuację, w której mógłby być substytutem zrozumienia CoreGraphics. – algal