Получение CGRect из массива - PullRequest
11 голосов
/ 25 марта 2011

Для моего приложения я пытаюсь сохранить CGRect объекты в NSMutableArray. Он хорошо загружается и печатает в операторе журнала, но попытка извлечь CGRect из массива показывает ошибку. Вот фрагмент кода:

CGRect lineRact = CGRectMake([[attributeDict objectForKey:@"x"] floatValue], 
  [[attributeDict objectForKey:@"y"] floatValue], 
  [[attributeDict objectForKey:@"width"] floatValue], 
  [[attributeDict objectForKey:@"height"] floatValue]);

  [lineRactangle addObject:NSStringFromCGRect(lineRact)];

Как я могу получить ректы из массива?

Ответы [ 7 ]

41 голосов
/ 25 марта 2011

CGRect - это структура, а не объект, и поэтому не может быть сохранена в NSArrays или NSDictionaries. Вы можете превратить ее в строку и превратить эту строку обратно в CGRect, но лучше всего инкапсулировать ее через NSValue:

NSValue *myValue = [NSValue valueWithCGRect:myCGRect];

Затем вы можете сохранить этот объект NSValue в массивах и словарях. Чтобы превратить его обратно в CGRect, вам нужно сделать:

CGRect myOtherCGRect = [myValue CGRectValue];
22 голосов
/ 25 марта 2011
[lineRactangle addObject:[NSValue valueWithCGRect:lineRect]];
7 голосов
/ 25 марта 2011

Используйте NSValue, чтобы обернуть CGRect, таким образом, сохраните их в NSArray с.

Например:

CGRect r = CGRectMake(1,2,3,4);
NSValue *v = [NSValue valueWithCGRect:rect];
NSArray *a = [NSArray arrayWithObject:v];
CGRect r2 = [[a lastObject] CGRectValue];

См. документацию для других поддерживаемых структур.

2 голосов
/ 25 июля 2012

Если ваш объект можно установить с помощью «.frame», вы можете использовать:

// {{CGFloat x,CGFloat y}, {CGFloat width,CGFloat height}}
NSString *objectCoords = @"{{116,371},{85,42}}";
myObject.frame = CGRectFromString(objectcoords);

или для нескольких объектов:

NSArray *objectCoords = [NSArray arrayWithObjects:
                         @"{{116,371},{85,42}}",
                         @"{{173,43},{85,42}}",
                         @"{{145,200},{85,42}}",
                         nil];

myObject1.frame = CGRectFromString([objectCoords objectAtIndex:0]);
myObject2.frame = CGRectFromString([objectCoords objectAtIndex:1]);
myObject3.frame = CGRectFromString([objectCoords objectAtIndex:2]);
2 голосов
/ 22 июля 2012

На самом деле, я не думаю, что какой-либо из ответов до сих пор действительно отвечает на вопрос, заданный аджаем. Краткий ответ: вам нужно предоставить CGRectMake с intValue , а не floatValue элемента словаря. Если вам нужно сделать это для нескольких CGRect, вот рекомендуемый метод:

- (CGRect) NSArrayToCGRect: (NSDictionary *) attributeDict
{
    int x = [[attributeDict objectForKey:@"x"] intValue];
    int y = [[attributeDict objectForKey:@"y"] intValue];
    int w = [[attributeDict objectForKey:@"width"] intValue];
    int h = [[attributeDict objectForKey:@"height"] intValue];

    return CGRectFromString([NSString stringWithFormat: @"{{%d,%d},{%d,%d}}", x, y, w, h]);
}

Может быть более элегантный способ сделать это, но приведенный выше код работает.

0 голосов
/ 11 февраля 2012

или что-то более «экстремальное» ... создание массива, содержащего массивы CGRect (s)

movPosTable = [[NSArray alloc] initWithObjects:
            [[NSArray alloc] initWithObjects: [NSValue valueWithCGRect:[GridAB frame]], [NSValue valueWithCGRect:[GridBA frame]], [NSValue valueWithCGRect:[GridBB frame]], nil],
            [[NSArray alloc] initWithObjects: [NSValue valueWithCGRect:[GridAA frame]], [NSValue valueWithCGRect:[GridAC frame]], [NSValue valueWithCGRect:[GridBA frame]], [NSValue valueWithCGRect:[GridBB frame]], [NSValue valueWithCGRect:[GridBC frame]], nil],
            [[NSArray alloc] initWithObjects: [NSValue valueWithCGRect:[GridAB frame]], [NSValue valueWithCGRect:[GridBB frame]], [NSValue valueWithCGRect:[GridBC frame]], nil], nil];

, где 'GridAA', 'GridAB' и т. Д. Соответствуют UIViews

0 голосов
/ 25 марта 2011

CGRect - это структура, которую вы не можете поместить в NSArray. Вы можете добавлять только объекты к нему.

...