Задача C — создать UIImage из этого кода PaintCode

Я использую PaintCode, и он сгенерировал некоторый код для создания фигуры с наложенным текстом. Я хочу использовать код для анализа строки и создания UIImage, который я могу сохранить в фотопленку или поделиться им на FB, но я изо всех сил пытаюсь создать UIImage. Любая помощь будет здорово!

Вот код:

- (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];
}

person mwiggs    schedule 02.10.2014    source источник
comment
какую версию кода краски вы используете?   -  person Harshit Gupta    schedule 02.10.2014
comment
тогда я считаю, что вы должны быть в состоянии сделать это. Поскольку он также предоставляет функции для получения изображения, помимо предоставления вам кода для CGRect. обратитесь к этому руководству youtube.com/watch?v=QLoJrgVg8Ok#t=375 используя методы изображения и переменные, вы получите это   -  person Harshit Gupta    schedule 02.10.2014
comment
Я использовал вызов StyleKit для рисования кода, используя приведенный ниже код algal. Спасибо   -  person mwiggs    schedule 02.10.2014
comment
Но результат немного размыт...   -  person mwiggs    schedule 02.10.2014
comment
посмотрите, работают ли методы изображения?   -  person Harshit Gupta    schedule 02.10.2014
comment
Нет. Все еще размыто. Теперь мой код выглядит так: UIImage * finalImage = [StyleKit imageOfXXX]; вернуть финальное изображение; Я думаю, что проблема должна быть в другом. я буду искать   -  person mwiggs    schedule 03.10.2014
comment
знаете ли вы, масштабируется ли код кода краски в соответствии с его контейнером? Например, если у вас есть какой-то код для UIButton, если мы продолжим изменять размер кнопки, будет ли соответствующий код рисования масштабироваться автоматически или нет?   -  person Harshit Gupta    schedule 03.10.2014
comment
Создайте очень большое изображение в коде краски, а затем используйте его.   -  person Harshit Gupta    schedule 05.10.2014


Ответы (1)


Весь этот код рисования создается с расчетом на то, что он будет выполняться в графическом контексте, созданном и управляемом UIKit.

Это автоматически происходит в методе drawRect UIView. Но вы хотите сгенерировать UIImage, поэтому вам нужно настроить временный графический контекст только для этого.

Общий подход заключается в следующем:

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

Книга Эрики Садун по практическому рисованию UIKit, вероятно, является лучшим универсальным ресурсом для такого рода вещей.

Эквивалент в Swift (языковая версия 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()

Версия Swift 4+:

// specify size of the image
let imageSize = CGSize(width: 100, height: 100)
// create the graphics context
UIGraphicsBeginImageContextWithOptions(imageSize, 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()
person algal    schedule 02.10.2014
comment
Спасибо, это здорово. PaintCode на самом деле не работает по принципу «подключи и работай». - person n13; 19.02.2015
comment
Я бы сказал, что PaintCode — очень полезный инструмент для изучения CoreGraphics или для ускорения вашей работы с CoreGraphics, но мне сложно представить ситуацию, в которой он мог бы заменить понимание CoreGraphics. - person algal; 24.02.2015