有没有办法在iPad上启用表单的视差?

时间:2014-03-26 01:15:08

标签: ios ipad ios7 parallax

感谢您的回复: - )

我注意到在iPad上,表单工作表视图没有任何iOS 7视差效果,我实际上想要合并它,因为我觉得它看起来很酷。

No parallex effect *sad face*

这就是我所拥有的而且它没有那个,所以有办法做到这一点吗?怎么会去做呢?我用谷歌搜索谷歌并谷歌最终让我失望,因为没有合适的东西出现。

谢谢:)

1 个答案:

答案 0 :(得分:2)

这可以通过一些努力来完成。

首先,您需要知道如何将视差添加到视图中:

我为UIView提供了以下类别方法,以简化:

- (void)addDepthMotionX:(CGFloat)x y:(CGFloat)y {
    Class clazz = NSClassFromString(@"UIInterpolatingMotionEffect");
    if (clazz) {
        BOOL reverse = NO;
        if (CGAffineTransformEqualToTransform(self.transform, CGAffineTransformMakeRotation(-M_PI_2)) || CGAffineTransformEqualToTransform(self.transform, CGAffineTransformMakeRotation(M_PI_2))) {
            reverse = YES;
        }

        UIInterpolatingMotionEffect *eff = [[clazz alloc] initWithKeyPath:@"center.x" type:reverse ? UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis : UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
        eff.maximumRelativeValue = @(x);
        eff.minimumRelativeValue = @(-x);
        [self addMotionEffect:eff];
        eff = [[clazz alloc] initWithKeyPath:@"center.y" type:reverse ? UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis : UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis];
        eff.maximumRelativeValue = @(y);
        eff.minimumRelativeValue = @(-y);
        [self addMotionEffect:eff];
    }
}

代码受到保护,因此如果从iOS 7(或更高版本)以外的地方调用它将不会崩溃。

现在为视图添加视差:

[someView addDepthMotionX:10 y:10]; // pick an appropriate depth value

问题的最后一步是将其应用于您正在显示的视图控制器的根目录。

以下是您可以在视图控制器的viewWillAppear:方法中添加的代码。调整以满足您的需求:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if (self.isBeingPresented || self.isMovingToParentViewController) {
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && self.modalPresentationStyle == UIModalPresentationFormSheet) {
            [self.navigationController.view.superview addDepthMotionX:15 y:15];
        }
    }
}

此代码的一个问题是,如果用户在显示表单后将iPad旋转90度,则需要更新视差效果。但这会让你开始。