Преобразование CGPoint в NSValue - PullRequest
19 голосов
/ 21 апреля 2009

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

Ответы [ 7 ]

50 голосов
/ 21 апреля 2009

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

+ (NSValue *)valueWithCGPoint:(CGPoint)point

См. iPhone документ

14 голосов
/ 19 июня 2012
Ответ

@ 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

3 голосов
/ 25 апреля 2015

В Swift вы можете изменить значение следующим образом:

    var pointValueare = CGPointMake(30,30)
    NSValue(CGPoint: pointValueare)
1 голос
/ 17 апреля 2015

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

var pointValue = CGPointMake(10,10)
NSValue(CGPoint: pointValue)
1 голос
/ 05 мая 2011

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

0 голосов
/ 21 февраля 2019

Если вы используете последнюю версию Xcode (после 2015 года), вы можете принять для этого современный синтаксис Objective-C. Вам просто нужно обернуть CGPoint в @():

CGPoint primitivePoint = CGPointMake(4, 6);
NSValue *wrappedPoint = @(primitivePoint);

Под капотом компилятор вызовет для вас +[NSValue valueWithCGPoint:].

https://developer.apple.com/library/archive/releasenotes/ObjectiveC/ModernizationObjC/AdoptingModernObjective-C/AdoptingModernObjective-C.html

0 голосов
/ 21 апреля 2009

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

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