擦除与UILabel中的文本重叠的部分图像

我有它的用户可以在屏幕上移动图像和uilabel。 说这是一个黑色的图像和黑色的文字。 我希望与图像重叠的文本部分变得透明,以便背景显示出来,即使原本是相同的颜色,仍然可以读取文本。 希望这是有道理的。

我发现了一些删除触摸的链接。 我不确定如何使用与重叠的文本部分进行自动化。

也许像这样“用图像掩盖图像”? https://developer.apple.com/library/mac/#documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_images/dq_images.html

重叠文本的例子

这是我如何移动图像(也是文本)

-(void)graphicMoved:(UIPanGestureRecognizer *)recognizer { CGPoint translation = [recognizer translationInView:self.view]; recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y); [recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; } 

添加的代码我把文本和图像部分重叠后,我点击button上的creatAlphaClippedImage。 图像是imageMerge,标签是labelTest。

我所做的只是在开始时分配它们,然后在结束时分配输出impage,并将其分配给imageMerge.image,这个imageMerge.image被添加到我的视图中,只需要在angular落中的界面生成器来testing。 我不知道nslog应该显示什么,但它不是空的。

 -(void)createAlphaClippedImage { UIImageView *imageView = nil;//this will b your imageView, property that u are holding to UILabel *label = nil;//this will be your label, property that u are holding to imageView=imageMerge; label=labelTest; if (CGRectIntersectsRect(imageView.frame, label.frame)) { UIImage *bottomImage = imageView.image; UIImage *image = nil; UIGraphicsBeginImageContextWithOptions(bottomImage.size, NO, 0.0); CGRect imageRect = CGRectMake(0.0f, 0.0f, bottomImage.size.width, bottomImage.size.height); [bottomImage drawInRect:imageRect]; //the color that u want the text to have [[UIColor clearColor] set]; //change this textRect to change the position of text on image CGRect textRect = CGRectMake(CGRectGetMinX(label.frame) - CGRectGetMinX(imageView.frame), CGRectGetMinY(label.frame) - CGRectGetMinY(imageView.frame), CGRectGetWidth(label.frame), CGRectGetHeight(label.frame)); [label.text drawInRect:textRect withFont:label.font]; image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); imageView.image = image; imageMerge.image=image; NSLog(@"ImageMerge %@\n",imageMerge.image); } } 

假设你已经在屏幕上移动你的imageView了。 让我继续做什么。

  1. 当你触摸imageView。 使用我将提供的代码更改其中的图像。
  2. 一旦完成移动imageView,用旧的图像replace新的图像

新图像=黑色图像+黑色文字; 旧图像=黑色图像+透明文本;

 -(UIImage *)customImage:(NSString *)cellImageName withText:(NSString *)badgeText textColor:(UIColor*)color { UIImage *bottomImage = [UIImage imageNamed:cellImageName]; //Change the font size to change text size CGSize stringSize = [badgeText sizeWithFont:[UIFont systemFontOfSize:[UIFont systemFontSize]]]; UIImage *image = nil; UIGraphicsBeginImageContextWithOptions(bottomImage.size, NO, 0.0); CGRect imageRect = CGRectMake(0.0f, 0.0f, bottomImage.size.width, bottomImage.size.height); [bottomImage drawInRect:imageRect]; //the color that u want the text to have [color set]; //change this textRect to change the position of text on image CGRect textRect = CGRectMake((bottomImage.size.width - stringSize.width)/2.0f, bottomImage.size.height - stringSize.height, stringSize.width, stringSize.height); [badgeText drawInRect:textRect withFont:[UIFont systemFontOfSize:[UIFont systemFontSize]]]; image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 

现在在你开始之前,扔掉标签,为了方便起见(如果你愿意的话,你可以用CALayer代替UIImageView),而不是

imageView.image = image你可以写layer.contents =(id)image.CGImage

现在,当你设置我的ImageView或图层,然后首先获取图像

UIImage * image = [self customImage:@“Image Name”withText:@“Text”textColor:[UIColor blackColor]];

并把这个图像放入imageView或图层

现在,当你开始移动你的imageview或图层。 在触摸开始或无论哪种方法是您的第一响应者的触摸。 再次将图像replace为

UIImage * image = [self customImage:@“Image Name”withText:@“Text”textColor:[UIColor clearColor]];

并在touchesEndedreplace图像再次黑色文本的第一个电话。

这应该让你去。 让我知道万一有问题。

上面的方法提供了将文本写在图像的顶部,并创build一个新的图像与文本。 因此,你可以扔掉标签。

欢呼,玩得开心。

编辑

试试这个,没有尝试过,但应该工作

 -(void)createAlphaClippedImage { UIImageView *imageView = nil;//this will b your imageView, property that u are holding to UILabel *label = nil;//this will be your label, property that u are holding to if (CGRectIntersectsRect(imageView.frame, label.frame)) { UIImage *bottomImage = imageView.image; UIImage *image = nil; UIGraphicsBeginImageContextWithOptions(bottomImage.size, NO, 0.0); CGRect imageRect = CGRectMake(0.0f, 0.0f, bottomImage.size.width, bottomImage.size.height); [bottomImage drawInRect:imageRect]; //the color that u want the text to have [[UIColor clearColor] set]; //change this textRect to change the position of text on image CGRect textRect = CGRectMake(CGRectGetMinX(label.frame) - CGRectGetMinX(imageView.frame), CGRectGetMinY(label.frame) - CGRectGetMinY(imageView.frame), CGRectGetWidth(label.frame), CGRectGetHeight(label.frame)); [label.text drawInRect:textRect withFont:label.font]; image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); imageView.image = image; } } 

在touchesBegan和touchesMoved中调用此方法。 如果animation片断(不会发生),请尝试在animation块中调用它。

试试这个,让我知道。

编辑:链接到示例应用程序

我创build了一个示例应用程序,显示如何清除重叠区域。 核实。 https://www.dropbox.com/sh/5z45gkwgmstfyvu/lwzbUyh6IR