我的目的是比较几个移动对象的CGPoints
或CGPoint
值(以及应用程序也适用于Mac OS NSPoints
或NSPoint
值)来检测对象具有相同的位置。
我的第一个解决方案是快速枚举这些对象的数组并将所有CGPoints
存储到数组中,然后再次快速枚举对象数组以检查该位置是否与任何其他对象相同:
// STEP 1: Collect all Positions
NSMutableArray *allPositions = [NSMutableArray arrayWithCapacity:self.allObjects.count];
for (Object *myObject in self.allObjects) {
CGPoint myObjectPosition = ...;
[allPositions addObject:myObjectPosition]; // Problem here
}
// STEP 2: Check for Overlapping
for (Object *myObject in self.allObjects) {
CGPoint myObjectPosition = ...;
if ([allPositions containsObject:myObjectPosition] {
// Overlapping
}
}
这个问题是将点添加到allPositions
数组。因此可以使用NSValue
:
[NSValue valueWithCGPoint:point];
但这仅适用于iOS,对于Mac OS,必须使用valueWithPoint
和NSPoint
。
我可以保存可能会将x
和y
值保存在词典中并将它们存储到allPositions
数组中吗?或者,如果没有2倍快速枚举,是否有更好的解决方案? self.allObjects
...
答案 0 :(得分:5)
CGPoint 和 NSPoint 是相同的结构。如果他们有不同的名字并不重要,他们都拥有两个 CGFloat 。它们具有相同的尺寸和相同的对齐,因此它们可以互换使用。所以在你的情况下 valueWithPoint:适合。
修改
关于你要问的第二件事,这应该用宏来完成:
#if TARGET_OS_IPHONE
value= [NSValue valueWithCGPoint: point];
#else
value= [NSValue valueWithPoint: point];
#endif
重点回答:
#if TARGET_OS_IPHONE
point= value.CGPointValue;
#else
point= value.pointValue;
#endif
http://sealiesoftware.com/blog/archive/2010/8/16/TargetConditionalsh.html
答案 1 :(得分:1)
在使用通用iOS / OSX应用程序时,我使用NSValue类别解决了这个问题。 NSValue + CGPoint.h:
@interface NSValue (CGPoint)
#if TARGET_OS_MAC
+ (NSValue *)valueWithCGPoint:(CGPoint)point;
- (CGPoint)CGPointValue;
#endif
@end
NSValue + CGPoint.m:
#import "NSValue+CGPoint.h"
@implementation NSValue (CGPoint)
#if TARGET_OS_MAC
+ (NSValue *)valueWithCGPoint:(CGPoint)point {
return [NSValue valueWithPoint:point];
}
- (CGPoint)CGPointValue {
return [self pointValue];
}
#endif
@end
现在我可以在iOS和Mac上使用相同的代码,例如:
// store point in NSValue
CGPoint p = {10, 10};
NSValue *v = [NSValue valueWithCGPoint:p];
// read point from NSValue
CGPoint p2 = [v CGPointValue];
答案 2 :(得分:0)
//NSGeometry.h
typedef CGPoint NSPoint;
//CGGeometry.h
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
NSPoint
和CGpoint
相同;
// NSValue/+valueWithPoint:(NSPoint)point is available on Mac OS X
// NSValue/+valueWithCGPoint:(CGPoint)point is available on iOS
//save value in CGPoint
if([NSValue respondsToSelector:@selector(valueWithPoint:)])
{
NSPoint lPoint = NSPointFromCGPoint(lCGPoint);
// do some op
}
else {
// do some op
}
编辑
请勿使用respondsToSelector
,请使用TARGET_OS_IPHONE
宏。