CGContextSetLineWidth различной ширины вокруг пути - PullRequest
0 голосов
/ 29 октября 2010

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

Вид снизу: alt text

Вид снизу с пользовательским видом сверху: alt text

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

Вот мой код:

- (void)draw:(TTStyleContext*)context {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSaveGState(ctx);

    [_color setStroke];
    CGContextSetLineWidth(ctx, MIN(_xwidth, _ywidth));

    CGFloat fw = context.frame.size.width;
    CGFloat fh = context.frame.size.height;

    CGContextMoveToPoint(ctx, fw, floor(fh/2));
    CGContextAddArcToPoint(ctx, fw, fh, floor(fw/2), fh, RD(_radius));
    CGContextAddArcToPoint(ctx, 0, fh, 0, floor(fh/2), RD(_radius));
    CGContextAddArcToPoint(ctx, 0, 0, floor(fw/2), 0, RD(_radius));
    CGContextAddArcToPoint(ctx, fw, 0, fw, floor(fh/2), RD(_radius));
    CGContextClosePath(ctx);
    CGContextStrokePath(ctx);

    CGContextRestoreGState(ctx);

    context.frame = CGRectInset(context.frame, _xwidth/2, _ywidth/2);
    return [self.next draw:context];
}

После установки _xwidth и _ywidth ключевой частью этого кода будет MIN для ширины хода. Идея здесь в том, что рамка по умолчанию одинаковой ширины обводки. То, что я прошу это сделать, это сделать ширину хода больше по бокам, чем сверху и снизу. Использование MIN гарантирует, что ход не получит более толстый размер _xwidth и не попадет в центр. Если я использую значение _ywidth, стороны выглядят великолепно, но я больше не получаю прозрачный красный, потому что верхняя и нижняя границы просачиваются в центр. Это подводит меня к моему вопросу:

Есть ли способ указать мне, что я хочу, чтобы толщина обводки была _xwidth по бокам и _ywidth по верху и низу? Если нет, есть ли другой более простой способ? Я с видом?

С моим кодом, _xwidth установленным в 42, _ywidth установленным в 10, я получаю это: alt text Вы можете увидеть, что я собираюсь сделать здесь, и как мне нужно получить боковой ход, чтобы скрыть непокрытый красный фон.

Ответы [ 2 ]

0 голосов
/ 08 марта 2014

Было бы намного проще просто заполнить тот же самый путь, которым вы гладите.

0 голосов
/ 29 октября 2010

Мне удалось взломать его, изменив путь и погладив его более тонкой линией, а затем применив еще один штрих вокруг расширенного прямоугольника с более толстой линией, чтобы замаскировать переполнение

- (void)draw:(TTStyleContext*)context {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSaveGState(ctx);

    CGRect oldFrame = context.frame;

    context.frame = CGRectInset(context.frame, (_xwidth > _ywidth ? _xwidth/2 : 0), (_ywidth > _xwidth ? _ywidth/2 : 0));
    CGFloat ox = (_xwidth > _ywidth ? _xwidth/2 - _ywidth/2 : 0);
    CGFloat oy = (_ywidth > _xwidth ? _ywidth/2 - _xwidth/2 : 0);
    CGFloat fw = context.frame.size.width + ox + (_xwidth > _ywidth ? _ywidth : 0);
    CGFloat fh = context.frame.size.height + oy + (_ywidth > _xwidth ? _xwidth : 0);

    CGContextMoveToPoint(ctx, fw, floor(fh/2));
    CGContextAddArcToPoint(ctx, fw, fh, floor(fw/2), fh, RD(_radius));
    CGContextAddArcToPoint(ctx, ox, fh, ox, floor(fh/2), RD(_radius));
    CGContextAddArcToPoint(ctx, ox, oy, floor(fw/2), oy, RD(_radius));
    CGContextAddArcToPoint(ctx, fw, oy, fw, floor(fh/2), RD(_radius));
    CGContextClosePath(ctx);

    [_color setStroke];
    CGContextSetLineWidth(ctx, MIN(_xwidth, _ywidth));
    CGContextStrokePath(ctx);

    if (_xwidth != _ywidth) {
        CGContextSetLineWidth(ctx, MAX(_xwidth, _ywidth));
        CGContextStrokeRect(ctx, CGRectInset(oldFrame, (_ywidth > _xwidth ? -2*_xwidth : 0), (_xwidth > _ywidth ? -2*_ywidth : 0)));
    }

    CGContextRestoreGState(ctx);

    context.frame = CGRectInset(oldFrame, _xwidth/2, _ywidth/2);
    return [self.next draw:context];
}

alt text

...