【问题标题】:Converting a CGPoint to NSValue将 CGPoint 转换为 NSValue
【发布时间】:2009-04-21 14:52:28
【问题描述】:

CABasicAnimation.fromValue 中,我想将CGPoint 转换为“类”,所以我使用了NSValue valueWithPoint,但在设备模式或模拟器中无法正常工作... 如果在设备或模拟器中,则需要使用NSMakePointCGPointMake

【问题讨论】:

    标签: objective-c iphone cgpoint nsvalue


    【解决方案1】:

    NSValue 之外还有一个UIKit 定义了一个函数

    + (NSValue *)valueWithCGPoint:(CGPoint)point
    

    iPhone doc

    【讨论】:

    • 谢谢,非常有帮助,但请考虑这些方法复制值。查看我的答案。
    【解决方案2】:

    @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 对象(或者更确切地说是存储在其中的指针),您的应用程序可能会崩溃。
    【解决方案3】:

    在 Swift 中,您可以像这样更改值:

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

    【讨论】:

      【解决方案4】:

      &(cgpoint) -> 获取到 cgpoint 的引用(地址) (NSPoint *)&(cgpoint) -> 将该引用转换为 NSPoint 指针 *(NSPoint )(cgpoint) -> 取消引用该 NSPoint 指针以返回一个 NSPoint 以使返回类型快乐

      【讨论】:

        【解决方案5】:

        在 Swift 中,静态方法被更改为初始化方法:

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

        【讨论】:

          【解决方案6】:

          如果您使用的是最新版本的 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

          【讨论】:

            【解决方案7】:

            不要认为它是“转换”你的观点——NSValue 是一个包装类,它包含像 NSPoint 这样的原始结构。无论如何,这是您需要的功能。它是 Cocoa 的一部分,但不是 Cocoa Touch。您可以将整个函数添加到您的项目中,或者在任何需要的地方进行相同的转换。

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

            【讨论】:

            • 您能解释一下您的回复中使用的语法吗?看起来很有用。
            • 那个语法是错误的,所以这个函数,不管它是什么......(它没有解释),是无用的
            • 语法正确,但是强制转换没用,CGPointNSPoint是同一个类型(NSPoint吧typedef'd 是一个 CGPoint).
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-04
            • 2017-07-29
            • 1970-01-01
            • 2023-03-31
            • 1970-01-01
            相关资源
            最近更新 更多