簡體   English   中英

使用KVC獲取NSValue的最小/最大坐標轉換為NSArray中的CGPoints

[英]Getting the min/max coordinates of NSValue transformed CGPoints in an NSArray using KVC

我最近閱讀了一些關於Key-Value Coding文檔和一些博客文章,發現它非常有用。 我想把它用於我的案子,但到目前為止我還沒有成功。

在我的例子中,我有一個NSMutableArray包含CGPoint轉換為NSValue的。 我將為這個數據數組添加許多點,我想獲得最小/最大x和y值。 例如:

NSMutableArray *data = [[NSMutableArray alloc] init];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(20.0f, 10.0f)]];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(5.0f, -15.0f)]];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(-5.0f, 20.0f)]];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(15.0f, 30.0f)]];

// min X:  -5.0,  max X: 20.0
// min Y: -15.0,  max Y: 30.0

到目前為止我有兩種方法。 第一個是將這四個值存儲在類實例變量中,並在添加新對象時將其與這些變量進行比較,並在必要時更新它們。 第二個涉及for循環以找到極值,但是這種方法效率低下。

如果可能的話,我想使用KVC來完成這項任務,我相信這將是一個比我的更普遍的解決方案。 在將來,我可能還需要從數組中刪除一些對象,這將使我的第一個方法不適用,而我剩下的就是for-loop。

我嘗試使用一些關鍵路徑,即@"@max.x"@"@max.position.x"但我得到的只是一個NSUnknownKeyException

如果您使用類別告訴NSValue如何訪問CGPointxy值,您可以使它工作:

@interface NSValue (MyKeyCategory)
- (id)valueForKey:(NSString *)key;
@end

@implementation NSValue (MyKeyCategory)
- (id)valueForKey:(NSString *)key
{
    if (strcmp([self objCType], @encode(CGPoint)) == 0) {
        CGPoint p = [self CGPointValue];
        if ([key isEqualToString:@"x"]) {
            return @(p.x);
        } else if ([key isEqualToString:@"y"]) {
            return @(p.y);
        }
    }
    return [super valueForKey:key];
}
@end

然后

CGFloat maxx = [[yourArray valueForKeyPath:@"@max.x"] floatValue];

實際上有效。 但請注意,一個簡單的循環會更快,特別是如果你必須計算所有4個值@max.x@max.y@min.x@min.y

使用您當前的方法這是不可能的。 CGPoint不是obj-c對象,因此您無法通過KVC探索其值。 NSValueCGPoint視為二進制數據,並且沒有對數據的內部結構進行任何理解。 編譯后甚至無法訪問CGPoint字段的名稱xy

(KVC可以訪問CGPoint值的唯一例外是CAAnimationCALayer ,它們會覆蓋鍵值搜索)。

可能最好的解決方案是自己實現它,注意你可以做一些聰明的緩存 - 在添加點時測試當前最大/最小值,並在移除當前最小值/最大值時清除最小值/最大值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM