2009-04-21 10 views
19

In CABasicAnimation.fromValue ich eine CGPoint zu einer „Klasse“ konvertiert werden soll, so habe ich NSValuevalueWithPoint aber im Gerätemodus oder Simulator ein nicht funktioniert ... müssen NSMakePoint oder CGPointMake wenn in Gerät verwenden oder Simulator.Konvertieren eines CGPoint zu NSValue

Antwort

50

Es gibt eine UIKit neben NSValue, die eine Funktion

+ (NSValue *)valueWithCGPoint:(CGPoint)point 

Siehe iPhone doc

definiert
+0

Danke, sehr hilfreich, aber bedenken Sie, dass diese Methoden Werte kopieren. Kasse meine Antwort. – DanSkeel

-2

Betrachten Sie es nicht als "konvertieren" Sie Ihren Punkt - NSValue ist eine Wrapper-Klasse, die primitive Strukturen wie NSPoint enthält. Wie auch immer, hier ist die Funktion, die Sie brauchen. Es ist Teil von Cocoa, aber nicht von Cocoa Touch. Sie können die gesamte Funktion zu Ihrem Projekt hinzufügen oder einfach dieselbe Konvertierung durchführen, wo immer Sie sie benötigen.

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

Können Sie bitte die in Ihrer Antwort verwendete Syntax erläutern? Sieht nützlich aus. – Dimitris

+0

diese Syntax ist ** falsch **, so ist die Funktion, was auch immer es ist ... (es ist nicht erklärt), ist _useless_. –

+0

Die Syntax ist korrekt, aber die Umwandlung ist nutzlos, * CGPoint * und * NSPoint * sind vom selben Typ (* NSPoint * ist typedef als * CGPoint *). –

1

& (CGPoint) -> erhalten eine Referenz (Adresse) CGPoint (NSPoint *) & (cgpoint) -> überträgt den Verweis auf einen NSPoint-Zeiger * (NSPoint ) (cgpoint) -> Dereferenzen, die NSPoint Zeiger auf einen NSPoint zurückgeben, um den Rückgabetyp glücklich machen

14

@ashcatch 's Antwort ist sehr hilfreich, aber bedenken Sie, dass diese Methoden aus Addition Werte kopieren, wenn native NSValue Methoden Zeiger speichern! Hier ist mein Code überprüft es:

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

hier newPoint.x = 2; point.x = 10


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

hier newPoint.x = 10; point.x = 10

+2

Aber Vorsicht beim zweiten Ansatz, da Sie im Beispiel einen Zeiger auf einen Speicherort auf dem Heap speichern. Wenn Sie also das erstellte NSValue-Objekt (oder vielmehr den darin gespeicherten Zeiger) verwenden, nachdem Sie den Gültigkeitsbereich der Punktdeklaration verlassen haben, stürzt Ihre Anwendung möglicherweise ab. – ashcatch

1

In Swift die statische Methode ist der Wandel zu einer initialiser Methode:

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

In Swift können Sie einen Wert wie folgt ändern:

var pointValueare = CGPointMake(30,30) 
    NSValue(CGPoint: pointValueare)