iOS, imágenes generadas y enmascaramiento

Estoy intentando generar una image que tenga forma de rombo y muestre un porcentaje finalizado versus inconcluso. La forma en que implementé esto fue la siguiente:

  • Genere 2 rectangularjs: uno del tamaño de la región llena y el otro del tamaño del rectángulo vacío.
  • Invoque UIGrapicsBeginImageContext () con el tamaño del rectángulo en el que estoy interesado
  • Dibuja los 2 rectangularjs en el context uno al lado del otro
  • Coge la image del context y termina el context
  • Cree una nueva image enmascarada utilizando CGImageMaskCreate () seguido de CGImageCreateWithMask () y extraiga la image enmascarada

Genero los maps de bits llenos y vacíos usando extensiones de categoría a UIImage, y luego les aplico una image de máscara estática.

El problema: Esto funciona bien en el simulador, pero el enmascaramiento no funciona en un dispositivo real.

En lugar de include el código aquí, incluyo un enlace a un proyecto que tiene el código. Los files relevantes son:

  • UIImage.h / UIImage.m : la extensión de categoría a UIImage que agrega tanto "crear una image con un color específico" como "crear una image enmascarada usando la máscara suministrada".
  • TLRangeDisplay.h / TLRangeDisplay.m : el código para mi pantalla de estado en forma de rombo. La rutina de interés allí es fillWithRect () .

Aquí está el código que agregué a UIImage (a través de una categoría):

+ (UIImage *)imageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [color CGColor]); CGContextFillRect(context, rect); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } + (UIImage *)imageWithColor:(UIColor *)color andSize:(CGSize)size { CGRect rect = CGRectMake(0.0f, 0.0f, size.height, size.width); UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [color CGColor]); CGContextFillRect(context, rect); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } - (UIImage*) maskWith:(UIImage *)maskImage { CGImageRef maskRef = maskImage.CGImage; CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); CGImageRef masked = CGImageCreateWithMask([self CGImage], mask); UIImage* image = [UIImage imageWithCGImage:masked]; CFRelease(mask); CFRelease(masked); return image; } 

Y aquí está la rutina que hace el enmascaramiento:

 -(void)fillWithRect { CGRect f = self.frame; CGFloat width = f.size.width; CGFloat fullRange = maxValue_ - minValue_; CGFloat filledRange = currentValue_ - minValue_; CGRect fillRect = CGRectMake(0, 0, (filledRange * width) / fullRange, f.size.height); CGRect emptyRect = CGRectMake(fillRect.size.width, 0, width - fillRect.size.width, f.size.height); UIImage *fillImage = nil; UIImage *emptyImage = nil; if(fillRect.size.width > 0) { fillImage = [UIImage imageWithColor:fillColor_ andSize:fillRect.size]; } if(emptyRect.size.width > 0) { emptyImage = [UIImage imageWithColor:emptyColor_ andSize:emptyRect.size]; } // Build the 2-color image UIGraphicsBeginImageContext(f.size); [fillImage drawInRect:fillRect]; [emptyImage drawInRect:emptyRect]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // Mask it if(nil != maskImage_) image = [image maskWith:maskImage_]; CGRect fullRect = CGRectMake(0, 0, f.size.width, f.size.height); // Merge ith with the shape UIGraphicsBeginImageContext(f.size); [image drawInRect:fullRect]; [shapeImage_ drawInRect:fullRect]; image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); [shownView_ removeFromSuperview]; shownView_ = [[UIImageView alloc] initWithImage:image]; [self addSubview:shownView_]; if(nil != shownView_) [self bringSubviewToFront:shownView_]; } 

El proyecto se puede download desde http://dl.dropbox.com/u/5375467/ColorPlayOS4.zip

Gracias por cualquier idea sobre este problema!

    Intereting Posts