2011-05-13 7 views
11

Puedo consultar si un UIColor es un patrón al inspeccionar la instancia CGColor que envuelve, la función CGColorGetPattern() devuelve el patrón si existe, o null si no es un color de patrón.Obtiene el tamaño del patrón repetido de UIColor?

método

CGPatternCreate() requiere un bounds al crear un patrón, este valor define el tamaño de la baldosa patrón (Conocido como celda de cuarzo de la jerga).

¿Cómo voy a recuperar este tamaño de patrón de UIColor, o el respaldo CGPattern una vez que se ha creado?

Respuesta

6

Si su aplicación está destinada a la distribución interna solamente, entonces puede usar una API privada. Si nos fijamos en las funciones definidas en el marco CoreGraphics, verá que hay un montón de funciones y entre ellos uno llamado CGPatternGetBounds:

otool -tV /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics | egrep "^_CGPattern" 

Sólo tienes que hacer un poco de búsqueda de función en el marco y utilizarlo a través de un puntero de función.

La cabecera para incluir:

#include <dlfcn.h> 

La función de puntero:

typedef CGRect (*CGPatternGetBounds)(CGPatternRef pattern); 

El código para recuperar la función:

void *handle = dlopen("/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics", RTLD_NOW); 
CGPatternGetBounds getBounds = (CGPatternGetBounds) dlsym(handle, "CGPatternGetBounds"); 

El código para recuperar los límites:

UIColor *uicolor = [UIColor groupTableViewBackgroundColor]; // Select a pattern color 
CGColorRef color = [uicolor CGColor]; 
CGPatternRef pattern = CGColorGetPattern(color); 
CGRect bounds = getBounds (pattern); // This result is a CGRect(0, 0, 84, 1) 
1

No parece haber ninguna forma de recuperar directamente la información de CGPatternRef.

Si debe hacer esto, probablemente la única manera (además de hurgar en los contenidos privados de la estructura CGPattern, que probablemente cuenta como "usar API privadas") es renderizar el patrón en un buffer de imagen suficientemente grande y luego detectar la subunidad repetitiva. Finding repeating patterns/images in images puede ser un buen punto de partida para eso.

+0

¿Algún indicio de cómo voy a ir y penetrar en el interior? Eso funcionaría para aplicaciones distribuidas internamente, y no en App Store. – PeyloW

+0

Tendría que encontrar una declaración para struct CGPattern o simplemente inspeccionar la memoria en el depurador. Y luego espero que no cambien el diseño en una versión futura del marco. – Anomie

5

Yo no creo que es posible conseguir los límites de la CGPatternRef, si eso es lo que está pidiendo

1

La fabricación de su propia clase de color que almacena los límites para que pueda acceder a ellos a través de una propiedad que podría ser una solución viable .

La extracción de los límites del patrón de UIColor no parece posible.

Cuestiones relacionadas