0

私の問題:塗りつぶしの正方形の色は、遷移色(最も暗い青、濃い青、青...)なしで黒から完全な青(255)になります。CGContextSetRGBStrokeは加算的(WTF Oo)のようです。たとえば、青が14で、次の更新で140を設定した場合、青は154になり、140ではなく設定します。

誰かがその問題を抱えていますか?

.hで

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

.mで

 - (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]; 
  }
4

1 に答える 1

1

次の行が表示されているので、簡単に答えてください。

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

カラーパーツはCGFloat0.0fから1.0fの範囲で指定する必要があります。あなたの青い色の部分が「0から255モード」にあるのでしょうか?

編集

コードから判断すると、色の計算では255の乗算を省略できると思います。yが0の場合、青色のコンポーネントとして0.0fが使用され、yが768の場合、1.0fになります。

于 2010-09-30T13:11:30.520 に答える