有没有办法为 iPad 上的表单启用视差?
Posted
技术标签:
【中文标题】有没有办法为 iPad 上的表单启用视差?【英文标题】:Is there a way to enable parallax for a Form Sheet on iPad? 【发布时间】:2014-03-26 01:15:07 【问题描述】:感谢您的光临 :-)
我注意到在 iPad 上的表单视图没有任何 ios 7 视差效果,我实际上想加入它,因为我觉得它看起来很酷。
嗯,这就是我所拥有的,而它没有,那么有没有办法做到这一点?一个人会怎么做呢?我用谷歌搜索和谷歌搜索,谷歌终于让我失望了,因为没有出现任何合适的东西。
谢谢:)
【问题讨论】:
【参考方案1】:这可以通过一些努力来完成。
首先,您需要知道如何为视图添加视差:
我为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 度,则需要更新视差效果。但这会让你开始。
【讨论】:
这真的很酷!哇!我明白你所说的 90 度是什么意思,幸运的是这是一个相当简单的解决方法 :-) 非常感谢!以上是关于有没有办法为 iPad 上的表单启用视差?的主要内容,如果未能解决你的问题,请参考以下文章