[英]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
如何訪問CGPoint
的x
和y
值,您可以使它工作:
@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探索其值。 NSValue
將CGPoint
視為二進制數據,並且沒有對數據的內部結構進行任何理解。 編譯后甚至無法訪問CGPoint
字段的名稱x
和y
。
(KVC可以訪問CGPoint
值的唯一例外是CAAnimation
和CALayer
,它們會覆蓋鍵值搜索)。
可能最好的解決方案是自己實現它,注意你可以做一些聰明的緩存 - 在添加點時測試當前最大/最小值,並在移除當前最小值/最大值時清除最小值/最大值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.