CGContextSetRGBFillColor не устанавливает хороший цвет - PullRequest
0 голосов
/ 30 сентября 2010

Моя проблема: цвет заполняющего квадрата меняется с черного на полный синий (255) без переходного цвета (темно-синий, темно-синий, синий ...).Кажется, что CGContextSetRGBStroke является аддитивным (WTF Oo).например, если синий был 14, а в следующем обновлении я поставил 140, синий будет 154, а не 140 я установил.

Кто-то получает эту проблему?

    CGFloat angle;
    int width;
    int height;
    NSTimer* timer; 
    CGPoint touch;

в .м

 - (id)initWithFrame:(CGRect)frame 
{
  if ((self = [super initWithFrame:frame])) 
    {
 angle=0;
 width = frame.size.width;
 height= frame.size.height;
 //self.backgroundColor=[UIColor colorWithRed:0.1 green:0.1 blue:1 alpha:1];
 timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(update:) userInfo:nil repeats:YES];
    }
    return self;
}

 -(void)update:(NSTimer*)theTimer
  {
     [self setNeedsDisplay];
  }

 NS_INLINE CGFloat radians(CGFloat ang)
 {
  return ang*(M_PI/180.0f);
 }

 - (void)drawRect:(CGRect)rect 
 {
    CGContextRef ctx=UIGraphicsGetCurrentContext();
    //CGContextSetRGBFillColor(ctx, -1,-1,-1,-1);

    CGContextSaveGState(ctx);
    CGRect ourRect = CGRectMake(40+angle, 40+angle, 240, 120);

    CGFloat colour=(touch.y/768)*255;
    NSQLog(@"draw %f",colour);
    CGContextSetRGBFillColor(ctx, 0.0,0.0,colour,1);
    CGContextClearRect(ctx, rect);

    CGContextFillRect(ctx, ourRect);

    CGContextSetRGBStrokeColor(ctx, 0.0, 1.0, 0.0, 1.0);
    CGContextStrokeRectWithWidth(ctx, ourRect, 10);
    CGContextRestoreGState(ctx);

    angle+=1;  
 }

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {
       touch= [[touches anyObject] locationInView:self];
 }

 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
 {
       touch= [[touches anyObject] locationInView:self]; 
  }

1 Ответ

1 голос
/ 30 сентября 2010

Просто быстрый ответ, поскольку я вижу следующие строки:

CGFloat colour=(touch.y/768)*255;
CGContextSetRGBFillColor(ctx, 0.0,0.0,colour,1);

Цветовые части следует указывать как CGFloat в диапазоне от 0,0f до 1,0f. Может быть, ваш синий цвет находится в режиме «от 0 до 255»?

Редактировать

Судя по вашему коду, я думаю, вы можете пропустить умножение на 255 при расчете цвета. Когда y равно 0, у вас будет 0.0f в качестве синего компонента цвета, а когда y равно 768, это будет 1.0f.

...