具有自定义属性的UIMotionEffect

时间:2014-05-18 09:55:26

标签: ios objective-c ios7

我试图将UIMotionEffect应用于GLKView子类的自定义属性。这是我在视图设置中的代码:

UIInterpolatingMotionEffect *horizontalMotionEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"customCenter.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];    
horizontalMotionEffect.minimumRelativeValue = @(-50);
horizontalMotionEffect.maximumRelativeValue = @(50);
[self addMotionEffect:horizontalMotionEffect];

该属性定义为:

@property (nonatomic) CGPoint customCenter;

但是当我在动画循环中记录属性时,它的结果为0.我缺少什么?

1 个答案:

答案 0 :(得分:3)

我一直在寻找答案并自行找到解决方案。

我想为SCNNode设置动画,但是对于任何其他自定义对象都应该很容易。

我创建了UIMotionEffect的子类并覆盖keyPathsAndRelativeValuesForViewerOffset(viewerOffset: UIOffset) -> [String : AnyObject]?。我的子类初始化为SCNNode,因此它可以在倾斜手机时修改其属性。这样您就可以为不可动画的属性设置动画 这是我的快速代码:

class SCNNodeTiltMotionEffect: UIMotionEffect {

    var node: SCNNode? // The object you want to tilt
    var baseOrientation = SCNVector3Zero
    var verticalAngle = CGFloat(M_PI) / 4
    var horizontalAngle = CGFloat(M_PI) / 4

    init(node: SCNNode) {
        super.init()
        self.node = node // Set value at init
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func keyPathsAndRelativeValuesForViewerOffset(viewerOffset: UIOffset) -> [String : AnyObject]? {
        // Set any properties of your object with values of viewerOffset attributes
        node?.eulerAngles = SCNVector3Make(baseOrientation.x, baseOrientation.y + Float(viewerOffset.horizontal * horizontalAngle), baseOrientation.z - Float(viewerOffset.vertical * verticalAngle))
        return nil
    }
}

如果要为可设置动画的属性设置动画,则应返回包含关键路径和值的字典,或使用UIInterpolatingMotionEffectthe official documentation

中的更多详细信息