Получение CGRect из массива

Для моего приложения я пытаюсь сохранить объекты 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)];

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

Ответ 1

[lineRactangle addObject:[NSValue valueWithCGRect:lineRect]];

Ответ 2

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

NSValue *myValue = [NSValue valueWithCGRect:myCGRect];

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

CGRect myOtherCGRect = [myValue CGRectValue];

Ответ 3

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

Например:

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

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

Ответ 4

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

- (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]);
}

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

Ответ 5

Если ваш объект можно установить с помощью ".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]);

Ответ 6

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

Ответ 7

или что-то более "экстремальное"... создание массива, содержащего массивы 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