UIImage中的图形被扭曲了

时间:2012-07-16 06:31:47

标签: ios cocoa-touch uiimage core-animation core-graphics

我在我的应用中实现了一个高亮功能。此高亮显示在UIImage中绘制,因此可以将其保存为PNG表示。一切都很完美,但最近我意识到有点混乱。有时当我突出显示时,图纸会被扭曲。这是它的样子:

highlight stretching to the left

每当我移动手指以突出显示角色时,绘制的高光都会向左伸展。另一个:

highlight fading upward

在这一次中,每当我移动手指突出显示时,绘制的高光都会向上移动!

这对我来说非常困惑。这种情况时常发生,有时仅发生在某些页面上。有时它的效果很好:

perfect highlight

我很困惑为什么会这样。谁能告诉我或者至少让我知道为什么会这样?请帮帮我。

代码:

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

1 个答案:

答案 0 :(得分: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表示。