Простая проблема со слоем [iphone] - PullRequest
1 голос
/ 18 января 2010

В основном я сортирую объекты в массиве по значению y (самый дальний конец страницы находится в начале массива), но у меня возникли некоторые проблемы. Я присваиваю всем UIImageViews в массиве значение:

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

Поскольку это UIImageView, я должен поместить слой после «Blocky», иначе я получаю следующую ошибку:

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

Моя проблема в том, что, когда я сортирую его, я не знаю, куда поместить «.layer», поэтому я получаю ту же проблему, потому что UIImageViews не может самостоятельно обрабатывать ключи. Вот мой код сортировки:

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

Спасибо заранее, Оззи

Ответы [ 3 ]

0 голосов
/ 18 января 2010

Используйте NSMutableArray sortUsingFunction: context: method:

// 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];

Причина, по которой функция требуется (и вы не можете просто использовать sortUsingSelector: или sortUsingSortDescriptor :) в том, что вы не можете указать ключ KVC для идентификации только компонента y only как переменной сортировки .

Редактировать: изменено center.y на size.height.

Редактировать: Упс. Изменено size.height обратно на center.y. Исправлен тип для UIImageView, а не UIImage. Кажется, что объекты KVC теоретически могут поддерживать произвольные ключи, но некоторые будут, а некоторые нет.

0 голосов
/ 20 января 2010

Почему бы не установить свойство тега в каждом представлении, поскольку вы создаете их на основе высоты и извлекаете их по тегу?

0 голосов
/ 18 января 2010

Вы уверены, что CALayer должен принимать произвольные ключи KVC? Это выглядит неправильно для меня.

Разве вы не должны извлекать высоты в буфер структур и qsort что?

например

Я думаю, это будет примерно так:

//
// 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];

Редактировать: Изменено center.y на size.height.

Редактировать: Изменено size.height обратно на center.y. К сожалению.

Редактировать: UIImage изменен на UIImageView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...