2009-04-21 3 views
19

В CABasicAnimation.fromValue Я хочу, чтобы преобразовать CGPoint в «класс», так что я использовал NSValuevalueWithPoint, но в режиме устройства или тренажере один не работает ... нужно использовать NSMakePoint или CGPointMake, если в устройстве или тренажер.Преобразование CGPoint в NSValue

ответ

50

Существует UIKit дополнение к NSValue, который определяет функцию

+ (NSValue *)valueWithCGPoint:(CGPoint)point 

см iPhone doc

+0

Спасибо, очень полезно, но учтите, что эти методы копируют значения. Оформить мой ответ. – DanSkeel

-2

Не думайте об этом как о «преобразовании» вашей точки. NSValue - это класс-оболочка, который содержит примитивные структуры, такие как NSPoint. В любом случае, вот что вам нужно. Это часть какао, но не Cocoa Touch. Вы можете добавить всю функцию в свой проект или просто сделать то же самое преобразование, где вам это нужно.

NSPoint NSPointFromCGPoint(CGPoint cgpoint) { 
    return (*(NSPoint *)&(cgpoint)); 
} 
+1

Не могли бы вы объяснить синтаксис, использованный в вашем ответе? Выглядит полезно. – Dimitris

+0

этот синтаксис ** неправильный **, поэтому функция, независимо от того, что она ... (это не объяснено), _useless_. –

+0

Синтаксис верен, но приведение в действие бесполезно, * CGPoint * и * NSPoint * являются одним и тем же типом (* NSPoint * он typedef'd должен быть * CGPoint *). –

1

& (CGPoint) -> получить ссылку (адрес) в CGPoint (NSPoint *) & (cgpoint) -> отличает эту ссылку на указатель NSPoint * (NSPoint ) (cgpoint) -> различия, которые указатель NSPoint возвращает NSPoint, чтобы вернуть тип возврата happy

14

Ответ @ashcatch очень полезен, но учтите, что эти методы из добавочных значений копирования, когда родные методы NSValue хранят указатели! Здесь проверяет мой код его:

CGPoint point = CGPointMake(2, 4); 
NSValue *val = [NSValue valueWithCGPoint:point]; 
point.x = 10; 
CGPoint newPoint = [val CGPointValue]; 

здесь newPoint.x = 2; point.x = 10


CGPoint point = CGPointMake(2, 4); 
NSValue *val = [NSValue valueWithPointer:&point]; 
point.x = 10; 
CGPoint *newPoint = [val pointerValue]; 

здесь newPoint.x = 10; point.x = 10

+2

Но будьте осторожны со вторым подходом, так как в примере вы храните указатель на ячейку памяти в куче. Поэтому, если вы используете созданный объект NSValue (или, скорее, указатель, сохраненный в нем) после того, как вы покинули область объявления точки, ваше приложение может потерпеть крах. – ashcatch

1

В Swift статический метод изменения к методу Инициализатора:

var pointValue = CGPointMake(10,10) 
NSValue(CGPoint: pointValue) 
2

В Swift вы можете изменить значение, подобное этому:

var pointValueare = CGPointMake(30,30) 
    NSValue(CGPoint: pointValueare) 
Смежные вопросы