2011-05-13 5 views
11

Je peux demander si un UIColor est un motif en inspectant l'instance CGColor qu'il enveloppe, la fonction CGColorGetPattern() renvoie le motif s'il existe, ou null s'il ne s'agit pas d'une couleur de motif.Obtenez la taille du motif répété d'UIColor?

procédé CGPatternCreate() nécessite un bounds lors de la création d'un motif, cette valeur définit la taille du carreau de motif (appelée cellule dans le langage Quartz).

Comment procéder pour récupérer cette taille de motif à partir d'un UIColor ou du support CGPattern une fois qu'il a été créé?

Répondre

6

Si votre application est destinée uniquement à la distribution interne, vous pouvez utiliser une API privée. Si vous regardez les fonctions définies dans le cadre de CoreGraphics, vous verrez qu'il ya un tas de fonctions et parmi eux un appelé CGPatternGetBounds:

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

Il vous suffit de faire une recherche de fonction sur le cadre et l'utiliser à travers un pointeur de fonction.

L'en-tête pour inclure:

#include <dlfcn.h> 

Le pointeur de fonction:

typedef CGRect (*CGPatternGetBounds)(CGPatternRef pattern); 

Le code pour récupérer la fonction:

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

Le code pour récupérer les limites:

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

Il ne semble y avoir aucun moyen de récupérer directement des informations de CGPatternRef. Si vous devez le faire, probablement le seul moyen (en plus de piquer le contenu privé de la structure CGPattern, qui compte probablement comme "using private APIs") est de rendre le modèle à un tampon d'image suffisamment grand pour ensuite détecter la sous-unité répétée. Finding repeating patterns/images in images peut être un bon point de départ pour cela.

+0

Avez-vous des indices sur la façon dont je vais aller dans les internals? Cela fonctionnerait pour les applications distribuées en interne, et non sur App Store. – PeyloW

+0

Vous devez soit trouver une déclaration pour struct CGPattern ou simplement inspecter la mémoire dans le débogueur. Et puis espérons qu'ils ne changeront pas la mise en page dans une future version du framework. – Anomie

5

Je ne pense pas que son possible d'obtenir les limites de la CGPatternRef, si c'est ce que vous demandez

1

Faire votre propre classe de couleur qui stocke les limites et vous permettent d'y accéder par une propriété pourrait être une solution viable .

L'extraction des limites de motif de UIColor ne semble pas possible.

Questions connexes