2009-04-21 9 views
19
CABasicAnimation.fromValueでは CGPointを「クラス」に変換したいので、 NSValue valueWithPointを使用しましたが、デバイスモードまたはシミュレータでは動作しません... はデバイスまたはシミュレータの場合は NSMakePointまたは CGPointMakeを使用する必要があります。

CGPointをNSValueに変換する

答えて

50

+ (NSValue *)valueWithCGPoint:(CGPoint)point 

iPhone doc

+0

ありがとう、非常に便利ですが、これらのメソッドは値をコピーすると考えてください。私の答えをチェックアウトする。 – DanSkeel

-2

NSValueはNSPointのようなプリミティブな構造体を保持するラッパークラスです。とにかく、ここに必要な機能があります。それはココアの一部ですが、ココアタッチはありません。プロジェクト全体に関数を追加したり、必要に応じて同じ変換を行うことができます。

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

返信に使用する構文を教えてください。役に立つと思う。 – Dimitris

+0

その文法は**間違っている**なので、関数は何でも...(説明されていません)、_useless_です。 –

+0

構文は正しいですが、キャストは役に立たず、* CGPoint *と* NSPoint *は同じ型です(* NSPoint *はtypedefを* CGPoint *にします)。 –

1

&を参照してください関数を定義NSValueUIKitほかは(するCGPoint)があります - > (NSPoint *)をするCGPointへの参照(アドレス)を取得&(cgpoint) - > NSPointポインタへの参照をキャストする *(NSPoint (cgpoint) - > NSPointポインタが戻り値の型を幸せにするためにNSPointポインタを返すことを逆参照します。

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

しかし、この例では、ヒープ上のメモリ位置へのポインタを格納するので、2番目のアプローチに注意してください。したがって、ポイント宣言のスコープを離れた後に、作成されたNSValueオブジェクト(またはその中に格納されているポインタ)を使用すると、アプリケーションがクラッシュする可能性があります。 – ashcatch

1

静的メソッドが初期化子方式に変更されます。

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

Swiftでは、次のような値を変更することができます。

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