3

我的目的是比较几个移动对象CGPointsCGPoint值(并且该应用程序也适用于 Mac OSNSPointsNSPoint值),以检测对象是否具有相同的位置。

我对此的第一个解决方案是快速枚举这些对象的数组并将所有对象存储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 倍快速枚举?大约有100个物体self.allObjects......

4

3 回答 3

6

CGPointNSPoint是同一个结构。如果他们有不同的名字并不重要,他们都持有两个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

于 2013-06-18T12:12:07.990 回答
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];
于 2015-07-29T11:00:13.947 回答
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宏。

于 2013-06-18T12:20:51.033 回答