iPhone - Как нарисовать что-то в виде - PullRequest
0 голосов
/ 13 февраля 2011

Я получил этот кусок кода:

CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
CGFloat colors[] = {
    1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
};
CGGradientRef gradientRef = CGGradientCreateWithColorComponents(rgb, colors, NULL, sizeof(colors) / (sizeof(colors[0]) * 4));
CGColorSpaceRelease(rgb);
CGContextRef context = UIGraphicsGetCurrentContext();

CGRect rect = theCell.backgroundView.bounds;                
CGPoint start = CGPointMake(rect.origin.x, 0);
CGPoint end = CGPointMake(rect.origin.x, rect.size.height/2);

CGContextDrawLinearGradient(context, gradientRef, start, end, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);

И мне интересно, как я могу заставить его рисовать в назначенном виде и обтравочном прямоугольнике, передаваемом в параметры моей функции. Совет: я не возражаю против drawRect, я ничего не делаю на подклассы.

Совет 2: Я не хочу вставлять слои, которые не смогу удалить позже.

Совет 3: этот фрагмент кода не рисует ничего, что могли видеть мои глаза ..... :-( Отсутствует графический порт?

Совет 4: Я хотел бы стереть рисунок, просто изменив цвет фона, и все готово ...

Ответы [ 2 ]

2 голосов
/ 13 февраля 2011

CGContextRef context = UIGraphicsGetCurrentContext(); получит графический контекст для текущего представления, поэтому, если вы вызовете это в drawRect: метод UIView, он будет рисовать.

Я не понимаю, что вы подразумеваете под:

Я не возражаю против drawRect, я не подклассы ничего

но если вы хотите сделать собственный чертеж, вы должны либо переопределить drawRect: метод, либо использовать слои. Чтобы использовать слои, вы бы назвали CGContextRef context = CGLayerGetContext(theLayer); вместо CGContextRef context = UIGraphicsGetCurrentContext();.

Хорошо, я посмотрел документацию и там сказано, что вы можете получить CGContextRef, вызвав UIGraphicsGetCurrentContext () из drawRectMethod. Вот что он говорит: В приложении для iOS вы устанавливаете объект UIView для рисования и реализуете метод drawRect: для выполнения рисования. Перед вызовом пользовательского метода drawRect: объект вида автоматически настраивает свою среду рисования, чтобы ваш код мог немедленно начать рисование. В рамках этой конфигурации объект UIView создает графический контекст (непрозрачный тип CGContextRef) для текущей среды рисования. Вы получаете этот графический контекст, вызывая функцию UIKit UIGraphicsGetCurrentContext. Вы сохраняете и восстанавливаете графические контексты, используя функции UIGraphicsPushContext и UIGraphicsPopContext.

Вы можете создавать собственные графические контекстные объекты в ситуациях, когда вы хотите рисовать где-то, кроме вашего вида. Например, вы можете захватить серию команд рисования и использовать их для создания изображения или файла PDF. Чтобы создать контекст, вы используете функцию CGBitmapContextCreate или CGPDFContextCreate. После того, как у вас есть контекст, вы можете передать его функциям рисования, необходимым для создания вашего контента.

При создании пользовательских контекстов система координат для этих контекстов отличается от собственной системы координат, используемой iOS. Вместо того чтобы исходная точка находилась в верхнем левом углу поверхности рисования, она находится в нижнем левом углу, а оси направлены вверх и вправо. Координаты, которые вы указываете в своих командах рисования, должны принимать это во внимание, иначе полученное изображение или файл PDF могут отображаться неправильно при визуализации. Подробности об использовании CGBitmapContextCreate и CGPDFContextCreate см. В «Создание контекста растровой графики» и «Создание контекста графики PDF».

0 голосов
/ 13 февраля 2011

Могу ли я порекомендовать вам заглянуть в CAGradientLayer и добавить его в качестве подслоя вашего представления? Намного проще, и аппаратное ускорение будет иметь значение для ячеек таблицы.

Пример, частично украденный отсюда:

http://tumbljack.com/post/188089679/gpu-accelerated-awesomeness-with-cagradientlayer

#import <QuartzCore/QuartzCore.h>  // Also import this framework
......
CAGradientLayer grad = [CAGradientLayer layer];

UIColor *colorOne     = [UIColor colorWithHRed:1.0f Green:1.0f Blue:1.0f alpha:1.0f];
UIColor *colorTwo     = [UIColor colorWithHRed:0.0f Green:0.0f Blue:0.0f alpha:1.0f];

NSArray *colors =  [NSArray arrayWithObjects:(id)colorOne.CGColor, colorTwo.CGColor, nil];
grad.colors = colors;

CGRect rect = theCell.backgroundView.bounds; 
rect.size.height = rect.size.height / 2;
grad.frame = rect;
[self.layer addsublayer:grad]

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

...