如何创建精确的视差场景?

时间:2014-08-23 12:59:19

标签: ios uiview parallax

我创建了UIView类的扩展,以便在整个项目中实现视差效果。我会建议你这样做,这样容易得多。

#pragma mark - Handling Effects

- (void)setMotion:(CGFloat)motion
{
    if (motion == 0) {

        for (UIMotionEffect *motionEffect in self.motionEffects) {

            [self removeMotionEffect:motionEffect];
        }
    }
    else {

        UIInterpolatingMotionEffect *horizontalEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
        horizontalEffect.minimumRelativeValue = @(motion);
        horizontalEffect.maximumRelativeValue = @(-motion);

        UIInterpolatingMotionEffect *verticalEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis];
        verticalEffect.minimumRelativeValue = @(motion);
        verticalEffect.maximumRelativeValue = @(-motion);

        [self addMotionEffect:horizontalEffect];
        [self addMotionEffect:verticalEffect];
    }
}

- (CGFloat)motion
{
    if (self.motionEffects.count == 0) {

        return 0;
    }
    else {

        UIInterpolatingMotionEffect *horizontalEffect = (UIInterpolatingMotionEffect *)[self.motionEffects objectAtIndex:0];

        return [horizontalEffect.minimumRelativeValue floatValue];
    }
}

示例:

view1.motion = 10;
view2.motion = 15;
view3.motion = 20;

问题是效果不太准确。是的,它看起来像是视差,但我没有强烈的感觉,我出现在3D风景中。视图向左滑动一点或向右滑动一点。

无论如何,我可以根据它的大小来计算UIView的视差运动(.motion)吗? 我猜测角度大小和观察点,但我不知道这些是如何测量的......

1 个答案:

答案 0 :(得分:0)

此等式描述了物体相对于它们所处距离的大小:

angularSize = realSize / distance;

通过实现自己的初始化方法:

- (instancetype)initWithRealSize:(CGSize)realSize;

您可以通过调整视距来更改视图的大小。

运动值可按如下方式计算:

horizontalMotion = angularSize.width / 10.0;

verticalMotion = angularSize.height / 10.0;