Почему мой "initiwithframe" становится черным?CGRect рисунок закругленного угла с initwithframe - PullRequest
2 голосов
/ 14 ноября 2011

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

enter image description here

Вот loadView:

loadView { 
  CGRect frame = CGRectMake(screenWidth - OFFSET, DEFAULT_PADDING, 140, 40);
  miniC* mcView = [ [ [miniC alloc] initWithFrame:frame] autorelease];
  mcView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
  [[self view] addSubview:mcView]; 
}

Вот где я рисую. Я звоню в miniC:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Set Background Color & Border Color
    CGColorRef bgColor = [UIColor scrollViewTexturedBackgroundColor].CGColor; 
    CGColorRef borderColor = [UIColor grayColor].CGColor; 

    CGRect Rect = self.bounds;

    // Round Corners
    roundCorners(context, Rect);

    // Fill with bgcolor
    fillBackgroundColor(context, Rect, bgColor);

    // Add 1 px stroke
    CGRect strokeRect = Rect;
    strokeRect.size.height -= 1;
    strokeRect = (strokeRect);

    CGContextSetStrokeColorWithColor(context, borderColor);
    CGContextSetLineWidth(context, 1.0);
    CGContextStrokeRect(context, strokeRect);


    // Overlay Rect to Tint "scrollViewTexturedBackgroundColor" UIColor
    CGContextRef secondContext = UIGraphicsGetCurrentContext();

    // Set Background Color & Border Color
    CGColorRef obgColor = [UIColor colorWithRed:255/255 green:255/255 blue:255/255 alpha:.3].CGColor; 

    // Round Corners
    roundCorners(context, Rect);

    // Fill with bgcolor
    fillBackgroundColor(secondContext, Rect, obgColor);

}

Код рисует округленную рамку с нужным штрихом, но за новой закругленной рамкой есть черная коробка.Я пробовал кучу разных вещей, но не могу понять, как сделать фоновый цвет чётким.Кроме того, я знаю, что мог бы сделать это с QuartzCore, но не хочу.

PS Я новичок в объективе-c.

РЕДАКТИРОВАТЬ:

void roundCorners (контекст CGContextRef, CGRect rect) {

CGContextClearRect(context, rect);

CGFloat c = INSET + CORNER_RADIUS;

CGContextMoveToPoint(context, INSET, c);

CGContextAddArcToPoint(context, INSET, INSET, c, INSET, CORNER_RADIUS);    
CGContextAddLineToPoint(context, rect.size.width - c, INSET);
CGContextAddArcToPoint(context, rect.size.width - INSET, INSET, rect.size.width - INSET, c, CORNER_RADIUS);
CGContextAddLineToPoint(context, rect.size.width - INSET, rect.size.height - c);
CGContextAddArcToPoint(context, rect.size.width - INSET, rect.size.height - INSET, rect.size.width - c, rect.size.height -

INSET, CORNER_RADIUS);CGContextAddLineToPoint (context, c, rect.size.height - INSET);

CGContextAddArcToPoint(context, INSET, rect.size.height - INSET, INSET, rect.size.height > - c, CORNER_RADIUS);

CGContextClosePath(context);

CGContextClip(context);

CGContextSetFillColorWithColor(context, [UIColor scrollViewTexturedBackgroundColor].CGColor);
CGContextFillRect(context, CGRectMake(0, 0, rect.size.width - INSET, rect.size.height - INSET));

}

void fillBackgroundColor (CGContextRef context, CGRect rect, CGColorRef bgColor) {

CGContextSetFillColorWithColor(context, bgColor);
CGContextFillRect(context, CGRectMake(0, 0, rect.size.width, rect.size.height));

}

Ответы [ 2 ]

5 голосов
/ 14 ноября 2011

Вам нужно установить цвет фона вашего UIView

, например

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}   

Некоторые другие вещи для рассмотрения, особенно когда вы говорите, что плохо знакомы с языком и т. Д.

Это присваивание CGRect Rect = self.bounds; является излишним, поскольку вам передают rect в качестве аргумента метода, чтобы вы могли удалить это.

Имя CGRect Rect для переменной невелико в Objective-C, поскольку вещи, начинающиеся с заглавной буквы, обычно являются константами, поэтому это может привести к путанице и вызвать некоторые проблемы в дальнейшем.

Это задание strokeRect = (strokeRect); излишне, само по себе прекрасно справляется с работой strokeRect.size.height -= 1;

Я могу ошибаться. Я не специалист по графическим технологиям, но я предполагаю, что CGContextRef secondContext = UIGraphicsGetCurrentContext(); вернет тот же контекст, что и раньше.

1 голос
/ 14 ноября 2011

CGContextClearRect очень сложно. Поскольку ваш контекст приходит к вам пустым, вы не должны использовать его, если вам не нужно. Если вы его используете, важно, чтобы backgroundColor вашего представления не был непрозрачным на 100%: его альфа должна быть меньше 1. В противном случае он окрашивается в черный цвет (как вы видите) вместо прозрачного.

Вы показываете слишком много кода, поэтому вы просто запутываете себя и усложняете жизнь тем, кто хочет вам помочь. Лучше всего начать с чего-то очень простого в качестве доказательства концепции. Вот чрезвычайно простое представление, которое рисует себя в виде круглого прямоугольника, используя CGContextClearRect и отсечение:

- (void) configure {
    self.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:.99];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self configure];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder 
{
    self = [super initWithCoder: aDecoder];
    if (self) {
        [self configure];
    }
    return self;
}

- (void) drawRect: (CGRect) rect {
    CGContextRef con = UIGraphicsGetCurrentContext();
    CGPathRef p = [[UIBezierPath bezierPathWithRoundedRect:rect 
                                              cornerRadius:10] CGPath];
    CGContextAddRect(con, rect);
    CGContextAddPath(con, p);
    CGContextEOClip(con);
    CGContextClearRect(con, rect);
}

Результат - красный прямоугольник с закругленными углами. Но ... Измените .99 на 1 в первой строке, и углы обзора получатся черными, как на вашей картинке! Это показывает важность непрозрачного цвета фона представления при использовании CGContextClearRect. (Я расцениваю это как ошибку, но это ни здесь, ни там; так было очень давно, и я не ожидаю, что все изменится.)

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