Рисование пикселей - Objective-C / Какао - PullRequest
0 голосов
/ 09 июня 2010

Я пытаюсь нарисовать отдельные пиксели в xcode для вывода на iphone. Я не знаю OpenGL или Quartz-кодирования, но немного знаю о Core Graphics. Я думал о рисовании маленьких прямоугольников с шириной и высотой один, но не знаю, как внедрить это в код и как заставить это показать в представлении. Любая помощь с благодарностью.

Ответы [ 3 ]

3 голосов
/ 14 апреля 2012

Для пользовательского подкласса UIView, который позволяет отображать точки фиксированного размера и цвета:

// Make a UIView subclass  
@interface PlotView : UIView  

@property (nonatomic) CGContextRef context;  
@property (nonatomic) CGLayerRef drawingLayer; // this is the drawing surface

- (void) plotPoint:(CGPoint) point; //public method for plotting  
- (void) clear; // erases drawing surface

@end  

// implementation  
#define kDrawingColor ([UIColor yellowColor].CGColor)
#define kLineWeight (1.5)

@implementation PlotView  
@synthesize context = _context, drawingLayer = _drawingLayer;

- (id) initPlotViewWithFrame:(CGRect) frame; {  

    self = [super initWithFrame:frame];
    if (self) {
        // this is total boilerplate, it rarely needs to change
        self.backgroundColor = [UIColor clearColor];
        CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
        CGFloat width = frame.size.width;
        CGFloat height = frame.size.height;
        size_t bitsPerComponent = 8;
        size_t bytesPerRow = (4 * width);
        self.context = CGBitmapContextCreate(NULL, width, height, bitsPerComponent, bytesPerRow, colorspace, kCGImageAlphaPremultipliedFirst);
        CGColorSpaceRelease(colorspace);
        CGSize size = frame.size;
        self.drawingLayer = CGLayerCreateWithContext(self.context, size, NULL);
    }
    return self;  
}  

// override drawRect to put drawing surface onto screen
// you don't actually call this directly, the system will call it
- (void) drawRect:(CGRect) rect; {

    // this creates a new blank image, then gets the surface you've drawn on, and stamps it down
    // at some point, the hardware will render this onto the screen
    CGContextRef currentContext = UIGraphicsGetCurrentContext();
    CGImageRef image = CGBitmapContextCreateImage(self.context);
    CGRect bounds = [self bounds];
    CGContextDrawImage(currentContext, bounds, image);
    CGImageRelease(image);
    CGContextDrawLayerInRect(currentContext, bounds, self.drawingLayer);
}

// simulate plotting dots by drawing a very short line with rounded ends
// if you need to draw some other kind of shape, study this part, along with the docs
- (void) plotPoint:(CGPoint) point; {

    CGContextRef layerContext = CGLayerGetContext(self.drawingLayer); // get ready to draw on your drawing surface

    // prepare to draw
    CGContextSetLineWidth(layerContext, kLineWeight);
    CGContextSetLineCap(layerContext, kCGLineCapRound);
    CGContextSetStrokeColorWithColor(layerContext, kDrawingColor);

    // draw onto surface by building a path, then stroking it
    CGContextBeginPath(layerContext); // start

    CGFloat x = point.x;
    CGFloat y = point.y;
    CGContextMoveToPoint(layerContext, x, y);
    CGContextAddLineToPoint(layerContext, x, y);

    CGContextStrokePath(layerContext); // finish

    [self setNeedsDisplay]; // this tells system to call drawRect at a time of it's choosing
}

- (void) clear; {

CGContextClearRect(CGLayerGetContext(self.drawingLayer), [self bounds]);
[self setNeedsDisplay];
}

// teardown
- (void) dealloc; {  

    CGContextRelease(_context);  
    CGLayerRelease(_drawingLayer);  
    [super dealloc];
}
1 голос
/ 14 апреля 2012

Если вы хотите иметь возможность рисовать пиксели, которые кумулятивно добавляются к некоторым ранее нарисованным пикселям, вам нужно будет создать собственный контекст растровой графики, опирающийся на вашу собственную растровую память. Затем вы можете установить отдельные пиксели в битовой памяти или нарисовать короткие линии или маленькие прямоугольники в своем графическом контексте. Чтобы отобразить контекст рисования, сначала преобразуйте его в CGImageRef. Затем вы можете нарисовать это изображение в подклассе UIView в drawRect представления или назначить изображение содержимому CALayer UIView.

Посмотрите: CGBitmapContextCreate и CGBitmapContextCreateImage в документации Apple.

ДОБАВЛЕНО:

Я написал более подробное объяснение того, почему вам может понадобиться сделать это при рисовании пикселей в приложении для iOS, а также некоторые фрагменты исходного кода в моем блоге: http://www.musingpaw.com/2012/04/drawing-in-ios-apps.html

0 голосов
/ 02 июля 2010

Все рисунки должны идти в метод - (void)drawRect:(CGRect)rect. [self setNeedsDisplay] отмечает код для перерисовки. Проблема в том, что вы ничего не перерисовываете.

...