2010-01-18 3 views
1

Fondamentalement, je suis le tri à travers des objets dans un tableau par valeur y (le plus loin en bas de la page est au début du tableau), mais je vais avoir un peu de mal. Je cédez tous les UIImageViews dans un tableau d'une valeur:problème de couche simple [iphone]

for (UIImageView *Blocky in objectsArray){ 
    [Blocky.layer setValue:[NSString stringWithFormat: @"%f", 
            Blocky.center.y] forKey:@"value"]; 
} 

Parce qu'il est un UIImageView je dois mettre la couche après « Blocky » sinon je reçois l'erreur suivante:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIImageView 0x3d44880> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key value.'

problème Ma est quand Je suis en train de le trier Je ne sais pas où placer le ". Layer" donc je reçois le même problème car UIImageViews ne peut pas gérer les touches de son propre chef. Voici mon code de tri:

NSSortDescriptor *sortDescriptor = 
    [[NSSortDescriptor alloc] initWithKey:@"value" ascending:YES]; 
[objectsArray sortUsingDescriptors:[NSArray 
            arrayWithObject:sortDescriptor]]; 
[sortDescriptor release]; 

Merci à l'avance, Ozzie

Répondre

0

Êtes-vous sûr CALayer est censé accepter les clés KVC arbitraires? Cela me semble faux.

Si vous n'extraire les hauteurs à un tampon de structures et qsort qui?

par exemple

je pense que ce serait quelque chose comme ceci:

// 
// before @implementation sections 
// 
typedef struct __MySortEntry { 
    UIImageView* image; 
    CGFloat height; 
} MySortEntry, *PMySortEntry; 

static int compareMySortEntry (const void * a, const void * b) 
{ 
    CGFloat temp =(((PMySortEntry)a)->height - ((PMySortEntry)b)->height); 
    return (temp<0)?-1:(temp>0)?1:0; 
} 

// 
// in @implementation section somewhere 
// 
NSMutableData* mutable = [[NSMutableData alloc] initWithLength: 
    sizeof(MySortEntry)*objectsArray.count]; 
PMySortEntry entries = (PMySortEntry)mutable.mutableBytes; 
for (int c = 0; c < objectsArray.count; c++) { 
    entries[c].image = (UIImageView*)[objectsArray objectAtIndex:c]; 
    entries[c].height = entries[c].image.center.y; 
} 

qsort(entries, objectArray.count, sizeof(MySortEntry), compareMySortEntry); 

for (int c=0; c < objectArray.count; c++) { 
    UIImage* imageInSequence = entries[c].image; 
    // do something with images **in sequence** 
} 
[mutable release]; 

Edit: Changé center.y-size.height.

Edit: Changé size.height Retour à center.y. Oops.

Edit: Changement UIImage à UIImageView.

+0

Désolé! Par hauteur, je veux dire qui a la plus grande valeur y plutôt que l'image la plus grande. – Ozzie

+0

CALayers sont des classes de conteneurs conformes au code-clé, donc ils sont construits pour accepter des clés et des valeurs arbitraires. –

0

Utilisez le NSMutableArray sortUsingFunction: contexte: Méthode:

// top of file 
static NSInteger compareImageHeights(id image1, id image2, void* context) { 
    CGFloat temp = ((UIImageView*)image2).center.y - ((UIImageView*)image1).center.y; 
    return (temp>0)?NSOrderedAscending:(temp<0)?NSOrderedDescending:NSOrderedSame; 
} 
// within file somewhere 
[objectsArray sortUsingFunction:compareImageHeights context:NULL]; 

La raison pour laquelle la fonction est nécessaire (et vous ne pouvez pas utiliser sortUsingSelector: ou sortUsingSortDescriptor :) est que vous ne pouvez pas spécifier une clé KVC pour identifier uniquement le composant y seulement comme variable de tri.

Edit: Changé center.y-size.height.

Editer: Oups. Changé size.height retour à center.y. Type fixe à UIImageView plutôt qu'UIImage. Il semble que les objets KVC supportent en théorie des clés arbitraires, mais certains le feront et d'autres non.

+0

En fait, l'utilisation de clés de cette manière est parfaitement bien sur un CALayer. CALayers sont des classes de conteneur conformes au codage de valeurs-clés, de sorte qu'elles sont conçues pour accepter des clés et des valeurs arbitraires. Voir la section "Layer Classes" du Core Animation Programming Guide: http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/WhatisCoreAnimation.html#//apple_ref/doc/uid/ TP40004689 –

0

Pourquoi définissez pas la propriété d'étiquette sur chaque vue que vous les créez en fonction de la hauteur et les récupérer par tag?