iOS / Mac OS:保存和比较数组中的CGPoints / NSPoints

时间:2013-06-18 11:48:07

标签: ios objective-c macos enumeration cgpoint

我的目的是比较几个移动对象的CGPointsCGPoint值(以及应用程序也适用于Mac OS NSPointsNSPoint值)来检测对象具有相同的位置。

我的第一个解决方案是快速枚举这些对象的数组并将所有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,必须使用valueWithPointNSPoint

我可以保存可能会将xy值保存在词典中并将它们存储到allPositions数组中吗?或者,如果没有2倍快速枚举,是否有更好的解决方案? self.allObjects ...

中有大约100个对象

3 个答案:

答案 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;

NSPointCGpoint相同;

// 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宏。