我试图将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.我缺少什么?
答案 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
}
}
如果要为可设置动画的属性设置动画,则应返回包含关键路径和值的字典,或使用UIInterpolatingMotionEffect
,the official documentation