CGContext: растровый фоновый цвет: невозможно установить белый: IOS - PullRequest
2 голосов
/ 03 февраля 2012

Я пытаюсь изменить какой-то простой код "создать приложение для рисования", чтобы он имел белый цвет фона, а не черный, для которого он установлен. Пример кода находится по адресу:

http://blog.effectiveui.com/?p=8105

Я попытался установить self.backgroundcolor = [UIColor whiteColor], а также [[UIColor whiteColor] setFill] без эффекта. Мне не хватает чего-то очень простого из-за моей неопытности.

У кого-нибудь есть идеи? Большое спасибо заранее!

Ответы [ 3 ]

1 голос
/ 03 февраля 2012

Я думаю, что часть, которую вы пропустили, это раздел PaintView:

 - (BOOL) initContext:(CGSize)size {

    int bitmapByteCount;
    int bitmapBytesPerRow;

    // Declare the number of bytes per row. Each pixel in the bitmap in this
    // example is represented by 4 bytes; 8 bits each of red, green, blue, and
    // alpha.
    bitmapBytesPerRow = (size.width * 4);
    bitmapByteCount = (bitmapBytesPerRow * size.height);

    // Allocate memory for image data. This is the destination in memory
    // where any drawing to the bitmap context will be rendered.
    cacheBitmap = malloc( bitmapByteCount );
    if (cacheBitmap == NULL){
        return NO;
    }
    cacheContext = CGBitmapContextCreate (cacheBitmap, size.width, size.height, 8, bitmapBytesPerRow, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst);
    return YES;
}

Это создает единственный контекст, который он называет кешем, к которому обращаются все последующие касания. В представлении drawRect: он просто копирует кэш в вывод.

Один из предоставляемых флагов - kCGImageAlphaNoneSkipFirst - указывает, что в кэшированном контексте нет альфа-канала. Поэтому, когда он нарисован, фон не будет виден независимо от каких-либо других факторов; черный цвет получается из cacheContext так же, как если бы вы рисовали черным пальцем.

Итак, что вы действительно хотите сделать, это заполнить cacheContext белым, прежде чем начать. Вы можете сделать это, установив массив cacheBitmap, поскольку вы явно указали контексту, где хранить его данные, или можете использовать подходящий CGContextFillRect для cacheContext.

1 голос
/ 07 сентября 2012

Если вы хотите использовать исходный код, но у вас есть четкий фон для изображения, которое вы создаете и «рисуете» - когда вы настраиваете cachedBitmap, делайте это так.

cacheContext = CGBitmapContextCreate ( cacheBitmap
                                      , size.width
                                      , size.height
                                      , 8
                                      , bitmapBytesPerRow
                                      , CGColorSpaceCreateDeviceRGB()
                                      , kCGImageAlphaPremultipliedFirst
                                     );

Таким образом, когда вы устанавливаете цвет обводки для «чернил», будут рисоваться только «чернила». Убедитесь, что чертежный вид также имеет цвет фона clearColor, а для непрозрачного установлено значение NO.

Это означает, что вид, к которому был добавлен чертежный вид, теперь будет виден снизу или через этот чертежный вид. Поэтому установите цвет фона этого вида на любой, какой вы хотите, или в качестве альтернативы, поместите UIImageView за чертежным видом и вуаля! Вы можете вставить изображение для линованной или миллиметровой бумаги или чего угодно!

1 голос
/ 03 февраля 2012

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

- (void)drawRect:(CGRect)rect {
    if(touch != nil){
        CGContextRef context = UIGraphicsGetCurrentContext();

        //clear background color to white
        [[UIColor whiteColor] setFill];
        CGContextFillRect(context, rect);

        hue += 0.005;
        if(hue > 1.0) hue = 0.0;
        UIColor *color = [UIColor colorWithHue:hue saturation:0.7 brightness:1.0 alpha:1.0];

        CGContextSetStrokeColorWithColor(context, [color CGColor]);
        CGContextSetLineCap(context, kCGLineCapRound);
        CGContextSetLineWidth(context, 15);

        CGPoint lastPoint = [touch previousLocationInView:self];
        CGPoint newPoint = [touch locationInView:self];

        CGContextMoveToPoint(context, lastPoint.x, lastPoint.y);
        CGContextAddLineToPoint(context, newPoint.x, newPoint.y);
        CGContextStrokePath(context);
    }
}

Причина view.backgroundColor = [UIColor whiteColor]; не сработало то, что любое представление, реализующее drawRect, игнорирует свойство backgroundColor, и программист отвечает за отрисовку всего содержимого представления, включая фон.

...