В CABasicAnimation.fromValue
Я хочу, чтобы преобразовать CGPoint
в «класс», так что я использовал NSValue
valueWithPoint
, но в режиме устройства или тренажере один не работает ... нужно использовать NSMakePoint
или CGPointMake
, если в устройстве или тренажер.Преобразование CGPoint в NSValue
ответ
Существует UIKit
дополнение к NSValue
, который определяет функцию
+ (NSValue *)valueWithCGPoint:(CGPoint)point
см iPhone doc
Не думайте об этом как о «преобразовании» вашей точки. NSValue - это класс-оболочка, который содержит примитивные структуры, такие как NSPoint. В любом случае, вот что вам нужно. Это часть какао, но не Cocoa Touch. Вы можете добавить всю функцию в свой проект или просто сделать то же самое преобразование, где вам это нужно.
NSPoint NSPointFromCGPoint(CGPoint cgpoint) {
return (*(NSPoint *)&(cgpoint));
}
Не могли бы вы объяснить синтаксис, использованный в вашем ответе? Выглядит полезно. – Dimitris
этот синтаксис ** неправильный **, поэтому функция, независимо от того, что она ... (это не объяснено), _useless_. –
Синтаксис верен, но приведение в действие бесполезно, * CGPoint * и * NSPoint * являются одним и тем же типом (* NSPoint * он typedef'd должен быть * CGPoint *). –
& (CGPoint) -> получить ссылку (адрес) в CGPoint (NSPoint *) & (cgpoint) -> отличает эту ссылку на указатель NSPoint * (NSPoint ) (cgpoint) -> различия, которые указатель NSPoint возвращает NSPoint, чтобы вернуть тип возврата happy
Ответ @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
Но будьте осторожны со вторым подходом, так как в примере вы храните указатель на ячейку памяти в куче. Поэтому, если вы используете созданный объект NSValue (или, скорее, указатель, сохраненный в нем) после того, как вы покинули область объявления точки, ваше приложение может потерпеть крах. – ashcatch
В Swift статический метод изменения к методу Инициализатора:
var pointValue = CGPointMake(10,10)
NSValue(CGPoint: pointValue)
В Swift вы можете изменить значение, подобное этому:
var pointValueare = CGPointMake(30,30)
NSValue(CGPoint: pointValueare)
Спасибо, очень полезно, но учтите, что эти методы копируют значения. Оформить мой ответ. – DanSkeel