Conversion d'un CGPoint à NSValue
-
12-09-2019 - |
Question
Dans CABasicAnimation.fromValue
Je veux convertir un CGPoint
à une « classe » si je NSValue
valueWithPoint
mais en mode appareil ou simulateur un ne fonctionne pas ...
besoin d'utiliser NSMakePoint
ou CGPointMake
si l'appareil ou simulateur.
La solution
Il y a un ajout de UIKit
à NSValue
qui définit une fonction
+ (NSValue *)valueWithCGPoint:(CGPoint)point
Voir iPhone doc
Autres conseils
La réponse de @ashcatch est très utile, mais considèrent que ces méthodes à partir des valeurs de copie d'addition, lorsque les méthodes NSValue
natives des pointeurs de magasin! Voici mon code le vérifier:
CGPoint point = CGPointMake(2, 4);
NSValue *val = [NSValue valueWithCGPoint:point];
point.x = 10;
CGPoint newPoint = [val CGPointValue];
ici newPoint.x = 2; point.x = 10
CGPoint point = CGPointMake(2, 4);
NSValue *val = [NSValue valueWithPointer:&point];
point.x = 10;
CGPoint *newPoint = [val pointerValue];
ici newPoint.x = 10; point.x = 10
Dans Swift, vous pouvez modifier une valeur comme ceci:
var pointValueare = CGPointMake(30,30)
NSValue(CGPoint: pointValueare)
& (cgpoint) -> obtenir une référence (adresse) à cgpoint (NSPoint *) & (cgpoint) -> jette cette référence à un pointeur NSPoint * (NSPoint ) (cgpoint) -> déréférence ce pointeur NSPoint pour retourner un NSPoint pour faire le type de retour heureux
Swift la méthode statique est le changement d'une méthode d'initialiser:
var pointValue = CGPointMake(10,10)
NSValue(CGPoint: pointValue)
Si vous utilisez une version récente ish de Xcode (après 2015), vous pouvez adopter la syntaxe moderne Objective-C pour cela. Vous avez juste besoin d'envelopper votre CGPoint dans @()
:
CGPoint primitivePoint = CGPointMake(4, 6);
NSValue *wrappedPoint = @(primitivePoint);
Sous le capot le compilateur appellera +[NSValue valueWithCGPoint:]
pour vous.
https: // développeur .apple.com / bibliothèque / archive / releasenotes / ObjectiveC / ModernizationObjC / AdoptingModernObjective-C / AdoptingModernObjective-C.html
Ne pensez pas comme « conversion » est NSValue mon seuil une classe wrapper qui tient struct primitifs comme NSPoint. Quoi qu'il en soit, voici la fonction dont vous avez besoin. Cela fait partie du cacao, mais pas Cocoa Touch. Vous pouvez ajouter toute fonction à votre projet, ou faire exactement la même conversion où que vous soyez.
NSPoint NSPointFromCGPoint(CGPoint cgpoint) {
return (*(NSPoint *)&(cgpoint));
}