从数组中获取CGRect

时间:2011-03-25 11:03:14

标签: objective-c ios nsarray cgrect

对于我的应用程序,我尝试将CGRect个对象存储到NSMutableArray中。它正在加载并在日志语句中打印,但尝试从数组中取CGRect s会显示错误。这是一段代码:

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

  [lineRactangle addObject:NSStringFromCGRect(lineRact)];

如何从数组中获取rects?

7 个答案:

答案 0 :(得分:41)

CGRect是结构,而不是对象,因此不能存储在NSArrays或NSDictionaries中。您可以将其转换为字符串并将该字符串转换回CGRect,但最好的方法是通过NSValue封装它:

NSValue *myValue = [NSValue valueWithCGRect:myCGRect];

然后,您可以将此NSValue对象存储在数组和词典中。要将其重新转换为CGRect,您需要:

CGRect myOtherCGRect = [myValue CGRectValue];

答案 1 :(得分:22)

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

答案 2 :(得分:7)

使用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

答案 3 :(得分:2)

实际上,我认为迄今为止的任何答案都没有真正解决ajay提出的问题。简短的回答是:您需要使用 intValue 提供 CGRectMake ,而不是字典项的 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]);
}

可能有更优雅的方法来完成此任务,但上述代码确实有效。

答案 4 :(得分:2)

如果可以使用“.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]);

答案 5 :(得分:0)

CGRect是一个你不能把它放在NSArray中的结构。您只能向其添加对象。

答案 6 :(得分:0)

或其他更多'极端' ...创建一个包含CGRect数组的数组

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