这是一个难题,想象一个典型的UIInterpolatingMotionEffect,

UIInterpolatingMotionEffect *horizontalMotionEffect =
  [[UIInterpolatingMotionEffect alloc]
    initWithKeyPath:@" .. some property .."
     type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
horizontalMotionEffect.minimumRelativeValue = @(-50);
horizontalMotionEffect.maximumRelativeValue = @(50);
[someView addMotionEffect:horizontalMotionEffect];

通常,您必须在此处的第3行中放置一个属性-例如,center.x

但是-如果我(非常简单地)想要查看UIInterpolatingMotionEffect的值怎么办?

(或者说,我可能会将其用于其他目的。)

我实际上是否必须继承CALayer并创建新的可动画设置的属性?!

仅仅获取价值似乎非常复杂。我唯一想到的技巧就是制作一个不可见的视图,将其设置为中心,然后获取值!虽然看起来很傻。

有任何想法吗?

最佳答案

您可以将UIInterpolatingMotionEffect子类化,并挂接到-(NSDictionary *)keyPathsAndRelativeValuesForViewerOffset:(UIOffset)viewerOffset方法中,以记录viewerOffset以获得规范化的值,或者查看 super 实现返回的字典以获取最小和最大值之间的插值。

UILogInterpolatingMotionEffect.h

@interface UILogInterpolatingMotionEffect : UIInterpolatingMotionEffect

@end

UILogInterpolatingMotionEffect.m
@implementation UILogInterpolatingMotionEffect

-(NSDictionary *)keyPathsAndRelativeValuesForViewerOffset:(UIOffset)viewerOffset
{
    NSDictionary *superDictionary = [super keyPathsAndRelativeValuesForViewerOffset:viewerOffset)];
    NSLog(@"%@, %@", NSStringFromUIOffset(viewerOffset), superDictionary);
    return superDictionary;
}

@end

PS:如果您只对viewerOffset感兴趣,甚至可以继承UIMotionEffect。另请参见UIMotionEffect class reference

10-05 20:26