iPhone - пытаясь создать волосы в кварце - PullRequest
2 голосов
/ 16 января 2012

У меня есть эта картинка, изображенная красным на следующем изображении. Я пытаюсь создать эту "волоску" по углам картинки. При печати линии должны иметь 1 точку ширины и 15 точек длины.

enter image description here

это код, который я использую ...

1) первое, что я делаю, это создаю контекст, который на 60 пунктов больше по горизонтали и вертикали, чтобы я мог рисовать черные линии.

CGFloat newWidth = 60.0f + redImage.size.width;
CGFloat newHeight = 60.0f + redImage.size.height;

UIGraphicsBeginImageContextWithOptions(CGSizeMake( newWidth, newHeight),
                                       YES,
                                       [redImage scale]);

Затем я определяю начало строк ...

NSArray *startOfPoints = [NSArray arrayWithObjects:
                   [NSValue valueWithCGPoint:CGPointMake(15, 0)],
                   [NSValue valueWithCGPoint:CGPointMake(15 + redImage.size.width, 0.0f)],
                   [NSValue valueWithCGPoint:CGPointMake(15, 15 + redImage.size.height)],
                   [NSValue valueWithCGPoint:CGPointMake(15 + redImage.size.width, 15 + redImage.size.height)],
                   [NSValue valueWithCGPoint:CGPointMake(0, 15)],
                   [NSValue valueWithCGPoint:CGPointMake(15 + redImage.size.width,15)],
                   [NSValue valueWithCGPoint:CGPointMake(0, 15 + redImage.size.height)],
                   [NSValue valueWithCGPoint:CGPointMake(15 + redImage.size.width, 
                                                         15 + redImage.size.height)],
                   nil];

// эти точки определяют по порядку начало каждой из четырех вертикальных линий и начало каждой из горизонтальных линий

Затем я рисую линии

    CGContextRef c = UIGraphicsGetCurrentContext();

// go to the beginning of each vertical line and draw the line down
    for (int i=0; i<4; i++) {
        CGPoint aPoint = [[startOfPoints objectAtIndex:i] CGPointValue];
        CGContextBeginPath(c);
        CGContextSetStrokeColorWithColor(c, [UIColor blackColor].CGColor);
        CGContextSetLineWidth(c, 1.0f);
        CGContextMoveToPoint(c, aPoint.x, aPoint.y);
        CGContextAddLineToPoint(c, aPoint.x, aPoint.y + 15.0f);
        CGContextStrokePath(c);
    }

// go to the beginning of each horizontal line and draw the line right
    for (int i=5; i<9; i++) {
        CGPoint aPoint = [[startOfPoints objectAtIndex:i] CGPointValue];
        CGContextBeginPath(c);
        CGContextSetStrokeColorWithColor(c, [UIColor blackColor].CGColor);
        CGContextSetLineWidth(c, 1.0f);
        CGContextMoveToPoint(c, aPoint.x, aPoint.y);
        CGContextAddLineToPoint(c, aPoint.x + 15.0f, aPoint.y );
        CGContextStrokePath(c);
    }

но я заканчиваю с огромным черным квадратом ...

что мне не хватает?

ПРИМЕЧАНИЕ: этот код не показывает нарисованное красное изображение, потому что я хочу получить правильные линии. Я получаю огромный черный квадрат вместо линий. Огромный квадрат имеет размер контекста и тот же, который я получил бы, если бы просто создал контекст и залил его черным ...: (

1 Ответ

1 голос
/ 16 января 2012

Когда вы создаете контекст растровой графики, используя UIGraphicsBeginImageContextWithOptions, каждый пиксель в растровом изображении инициализируется всеми нулями, которые являются черными (если вы установили opaque на YES, что вы сделали) или прозрачными (если вы установили *От 1003 * до НЕТ).

Вы можете заполнить растровое изображение белым, прежде чем рисовать что-либо еще, выполнив это сразу после возврата UIGraphicsBeginImageContextWithOptions:

[[UIColor whiteColor] setFill];
UIRectFill(CGRectMake(0, 0, newWidth, newHeight));
...