2016-10-05 4 views
0

У меня есть фон UIImage, и я хотел бы обрезать фон UIImage с помощью настраиваемой формы, чтобы это фоновое изображение только «появлялось» через пользовательскую форму. Например, у меня есть форма формы в форме луны, и мне хотелось бы, чтобы фоновое изображение проникало только на лунную часть.Обрезка UIImage пользовательской формой

на основе другого ответа, я пытаюсь наложить маску на изображение, как так:

- (UIImage *)createImageFromImage:(UIImage *)image 
        withMaskImage:(UIImage *)mask { 
    CGImageRef imageRef = image.CGImage; 
    CGImageRef maskRef = mask.CGImage; 

    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
              CGImageGetHeight(maskRef), 
              CGImageGetBitsPerComponent(maskRef), 
              CGImageGetBitsPerPixel(maskRef), 
              CGImageGetBytesPerRow(maskRef), 
              CGImageGetDataProvider(maskRef), 
              NULL, 
              YES); 

    CGImageRef maskedReference = CGImageCreateWithMask(imageRef, imageMask); 
    CGImageRelease(imageMask); 

    UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference]; 
    CGImageRelease(maskedReference); 

    return maskedImage; 
} 

Однако результат этого выглядит enter image description here, и есть несколько проблем с ним:

  1. Луна у меня есть 100 * 100, это растянулось, сделав странную пропорцию
  2. Моя цель только для изображения, которое должно пройти через луну - однако в настоящий момент луна - это белая фигура, которая наступает изображение

Любые идеи о том, как я мог бы исправить проблему урожая, будут высоко оценены. Благодаря!

+0

Вы можете использовать эту библиотеку для любой пользовательской формы. Просто нарисуйте свой путь, и вы получите обрезанное изображение. https://www.cocoacontrols.com/controls/mdimagecroper –

ответ

2

На вашем фоновом изображении вам нужно будет добавить пользовательскую маску через CALayer. Имейте в виду, все, что вы окрашиваете в mask.png (луна), будет видно, все transparent не будет отображаться.

UIImage *moonImage = [UIImage imageNamed:@"mask.png"]; 
CALayer *maskLayer = [CALayer layer]; 
[maskLayer setContents:(id)moonImage.CGImage]; 
[maskLayer setFrame:CGRectMake(0.0f, 0.0f, moonImage.size.width, moonImage.size.height)]; 

UIImageView *yourBackgroundImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)]; 
// Keep your image view in tact here, just add: 
[yourBackgroundImageView.layer setMask:maskLayer]; 
+0

Это отлично поработало и получило именно то, что мне нужно. Благодаря! – daspianist

+0

@daspianist Мне нужно точное поведение. Где я должен написать вышеуказанный код? – Dalvik

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