2

アプリにハイライト機能を実装しました。このハイライトは、PNG 表現として保存できるように UIImage に描画されています。すべてが完璧に機能していますが、最近、非常に紛らわしい問題に気付きました。ときどきハイライトをしていると、絵がゆがむことがあります。これは次のようになります。

左へのストレッチをハイライト

文字をハイライトするために指を動かすたびに、描画されたハイライトが左に伸びます。別のもの:

ハイライトフェードアップ

これは、指をハイライトに動かすたびに、描いたハイライトが上に動いていきます!

これはすべて私にとって非常に混乱しています。これはときどき発生し、特定のページだけで発生することもあります。時々、次のようにうまく動作します:

完璧なハイライト

なぜこれが起こっているのか、私は非常に混乱しています。なぜこれが起こっているのか、誰かが私に教えてくれるか、少なくとも私に考えを与えることができますか? 私を助けてください。

コード:

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

   for (int r = 0; r < [rectangles count]; r++) 
   {
      CGRect rect = [[rectangles objectAtIndex:r]CGRectValue];

      //Get the edges of the rectangles
      CGFloat xEdge = rect.origin.x + rect.size.width;
      CGFloat yEdge = rect.origin.y + rect.size.height;

    if ((currPoint.x > rect.origin.x && currPoint.x < xEdge) && (currPoint.y < rect.origin.y && currPoint.y > yEdge))
    {
        imgView.image = [self drawRectsToImage:imgView.image withRectOriginX:rect.origin.x originY:rect.origin.y rectWidth:rect.size.width rectHeight:rect.size.height];
        break;
    }
   }
}

//The function that draws the highlight
- (UIImage *)drawRectsToImage:(UIImage *)image withRectOriginX:(CGFloat)x originY:(CGFloat)y rectWidth:(CGFloat)width rectHeight:(CGFloat)ht
{
  UIGraphicsBeginImageContext(self.bounds.size);
  CGContextRef context = UIGraphicsGetCurrentContext();
  [image drawInRect:self.bounds];

  CGContextSetStrokeColorWithColor(context, [UIColor clearColor].CGColor);

  CGRect rect = CGRectMake(x, y, width, ht);
  CGContextAddRect(context, rect);
  CGContextSetCMYKFillColor(context, 0, 0, 1, 0, 0.5);
  CGContextFillRect(context, rect);

  UIImage *ret = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return ret;
}
4

1 に答える 1

1

これらのアーティファクトが発生する理由を正確に説明することはできませんが...

タッチハンドラーで画像をレンダリングするのは良い考えではないと思います。タッチ処理はできる限り少なくする必要があります。

CoreAnimation のCALayer:

このように画像を背景画像として設定するか (クラスが のサブクラスであると仮定UIView)、または実際の を使用しますUIImageView

self.layer.contents = (id)image.CGImage;

別の長方形rectがタッチされたことを検出したら、画像の背景の上にサブレイヤーとしてハイライトを追加します。

CALayer *highlightLayer = [CALayer layer];
highlightLayer.frame = rect;
highlightLayer.backgroundColor = [UIColor yellowColor].CGColor;
highlightLayer.opacity = 0.25f;
[self.layer addSublayer:highlightLayer];

レイヤー プロパティは、必要に応じてパフォーマンスを向上させるのshouldRasterizeに役立ちます。

self.layer.shouldRasterize = YES;

これらすべてを使用するには、QuartzCore フレームワークを使用<QuartzCore/QuartzCore.h>し、実装ファイルにインポートします。

self.layerを画像コンテキストにレンダリングして、レイヤー階層の PNG 表現を作成し、画像と PNG 表現を取得できます。

于 2012-07-28T12:38:13.167 に答える