Objective c 从数组中获取CGRect
对于我的应用程序,我试图将Objective c 从数组中获取CGRect,objective-c,ios,nsarray,cgrect,Objective C,Ios,Nsarray,Cgrect,对于我的应用程序,我试图将CGRect对象存储到NSMutableArray中。它很好地加载并在log语句中打印,但是尝试从数组中获取CGRects会显示一个错误。以下是一段代码片段: CGRect lineRact = CGRectMake([[attributeDict objectForKey:@"x"] floatValue], [[attributeDict objectForKey:@"y"] floatValue], [[attributeDict objectForK
CGRect
对象存储到NSMutableArray
中。它很好地加载并在log语句中打印,但是尝试从数组中获取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)];
如何从数组中取回rect?cgrct是一个结构,不能将其放入NSArray中。您只能向其中添加对象。CGRect是结构,而不是对象,因此不能存储在NSArray或NSDictionary中。您可以将其转换为字符串并将该字符串转换回CGRect,但最好的方法是通过NSValue将其封装:
NSValue *myValue = [NSValue valueWithCGRect:myCGRect];
然后可以将此NSValue对象存储在数组和字典中。要将其转换回CGRect,您需要执行以下操作:
CGRect myOtherCGRect = [myValue CGRectValue];
使用
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];
有关其他支撑结构,请参见。或更“极端”的内容。。。创建包含CGRect数组的数组
“GridAA”、“GridAB”等与UIView相对应的地方实际上,我认为迄今为止的任何答案都没有真正解决ajay提出的问题。简单的回答是:您需要为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]);
}
可能有一种更优雅的方法来实现这一点,但上面的代码确实有效。如果可以使用“.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]);
本附录最好作为参考答案的注释添加,因为人们无法将其视为解决方案,而它似乎是一条注释。或者今天,
NSValue*myValue=[NSValue-valueWithRect:myCGRect]
@FitterMan:这只适用于OSX,而不适用于iOS<代码>值WithRect:在iOS上不可用。但即使在OSX上,也不应该这样做:valueWithRect:
要求的是NSRect
,而不是CGRect
。在64位版本中,NSRect
是CGRect
的typedef,因此它在那里工作没有问题,但是对于没有将NS\u BUILD\u 32\u LIKE_64
define设置为1
的32位版本,您会收到警告/错误,因为它们被定义为两个独立的结构。尽管它们的内存表示是相同的,但编译器(正确地)将它们视为两种不同的东西。感谢您的澄清。
// {{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]);