2013-02-11 3 views
1

У меня есть он, где пользователь может перемещать изображение и uilabel вокруг экрана. Скажем, это черное изображение и черный текст. Я хочу, чтобы часть текста, которая накладывалась на изображение, стала прозрачной, чтобы фон показывался, и вы все равно можете читать текст, даже если они были изначально одного цвета. Надеюсь, это имеет смысл.Удаление части изображения, которое перекрывается с текстом из UILabel

Я нашел некоторые ссылки на стирание с прикосновением. Я не уверен, как это сделать с помощью части текста, который перекрывается.

Возможно, что-то вроде этого «Маскировка изображения с изображением»? https://developer.apple.com/library/mac/#documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_images/dq_images.html

Example of overlapping text

Вот как я переместить изображение (а также текст)

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


} 

Добавлен код Я звоню creatAlphaClippedImage на кнопку мыши после Я помещаю текст и изображение частично перекрывающиеся. Изображение - imageMerge, а ярлык - labelTest.

Все, что мне нужно, это назначить их в начале, а затем в конце, выполнить вывод impage и присвоить его imageMerge.image, который добавлен к моему представлению с помощью построителя интерфейса в углу, чтобы проверить. Я не знаю, что должен показать 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); 
} 
} 

ответ

2

Предполагая, что вы уже прошли, перемещая изображение вокруг экрана. Позвольте мне продолжить, что делать.

  1. Когда вы касаетесь изображения. Измените изображение в нем, используя код, который я собираюсь предоставить.
  2. После того, как вы закончите перемещение ImageView, замените новое изображение со старым Image

нова картинка = один с черным изображением + черный текст; старое изображение = одно с черное изображение + прозрачный текст;

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

Теперь, прежде чем начать, выбросить этикетку и для удобства (вы можете заменить UIImageView с CALayer, если вы хотите), то есть вместо

imageView.image = изображение вы можете написать layer.contents = (id) изображение.CGImage

Теперь, когда и установка ур ImageView или Layer, то сначала получить изображение

UIImage * изображение = [само customImage: @ "Название изображения" withText: @ "Текст" TextColor : [UIColor blackColor]];

и поместить этот файл в ImageView или слой

Теперь, когда вы начинаете двигаться ваш ImageView или слой. В touchesBegan или в зависимости от того, какой метод является вашим первым ответчиком на касание. Заменить изображение снова

UIImage * изображение = [само customImage: @ "Название изображения" withText: @ "Текст" TextColor: [UIColor clearColor]];

И в touchesEnded снова замените изображение первым вызовом черного текста.

Это должно вас заставить. Дайте мне знать в случае возникновения проблем.

Вышеуказанный метод обеспечивает запись текста поверх вашего изображения и создает новое изображение с текстом в нем. Следовательно, вы можете выбросить этикетку.

Cheers, получайте удовольствие.

EDIT

попробовать это, не пробовал сам, но должен работать

-(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. если анимация заикается (чего не бывает), попробуйте вызвать ее внутри блока анимации.

попробуйте это и дайте мне знать.

EDIT: LINK TO SAMPLE APP

Я создал пример приложения, показывающие, как очистить перекрывающихся областей. Проверьте это. https://www.dropbox.com/sh/5z45gkwgmstfyvu/lwzbUyh6IR

+0

Спасибо за ответ ... Я попробую. –

+0

Я ищу только часть текста, которая перекрывается, чтобы «вырезать» изображение. Я не вижу, где что-то о позиции текста, который мог бы это позволить? –

+1

не является частью текста. UILabel поверх изображения, которое вы хотели сделать прозрачным (текст), пока вы перемещаете изображение. Или это какое-то изображение, которое оно предварительно загрузило txt? – croyneaus4u

Смежные вопросы