ios 8 更改呈现/模态视图控制器的大小

Posted

技术标签:

【中文标题】ios 8 更改呈现/模态视图控制器的大小【英文标题】:ios 8 change the size of presented/modal view controller 【发布时间】:2014-09-12 14:58:11 【问题描述】:

ios 7 及之前的版本中,我正在更新presentedViewController.view.superview 的边界以自定义呈现的视图控制器的大小,但在ios 8 中似乎不再是这种情况了。由于无法在视图控制器上设置超级视图(尝试在调试器中调用它时返回 nil)。

对如何更新呈现的视图控制器的大小有什么建议吗?这将用于自定义演示转换。

【问题讨论】:

我为此做了一个 Github repo BonsaiController。 【参考方案1】:

我想下面的方法更简单,它适用于 iOS 8:

self.myViewController.modalPresentationStyle = UIModalPresentationFormSheet;
self.myViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

//This will be the size you want
self.myViewController.preferredContentSize = CGSizeMake(822, 549);

[self presentViewController:self.myViewController animated:YES completion:nil];

【讨论】:

如果您只需要默认的过渡样式,那么可以。 preferredContentSize 对我来说工作正常。但我需要改变我在 iOS 8 中的位置。我必须使用哪个属性? 不适用于 iPhone (iOS 8.4),可能适用于 iPad。【参考方案2】:

如果以后有人遇到这个问题,我就是这样解决的。

子类化 UIPresentationController 并在 frameOfPresentedViewInContainerView 中返回框架。将此输入到您为presentedViewController 创建的transitioningDelegate 中。

或者,您可以在 animateTransition: 中为presentedView 设置最终帧,它属于您为transitioningDelegate 创建的动画器对象。然而,这是旧的 iOS 7 的做法。由于 Apple 引入了 UIPresentationController,因此任何大小/框架的更改都应该在那里完成,这是我之前提到的方法。

这里有一些额外的信息,可能与解决问题没有直接关系。

对于那些从未接触过苹果视图控制器转换 api 的人,就像我以前一样,这里是步骤。

    创建符合 UIViewControllerTransitioningDelegate 的 YourTransitioningDelegate。在这里,一般需要设置三个东西,PresentationController、PrestedAnimationController、DismissedAnimationController。

    创建符合 UIViewControllerAnimatedTransitioning 的 YourTransitionAnimator。在这里,需要重写两个函数,transitionDuration 和 animateTransition(这是所有动画发生的地方,添加/删除和动画呈现的视图。让您在 transitionContext 上调用 completeTransition 以结束动画)。

    子类 UIPresentationController。取决于每个人的需求,你可以在这里做很多事情。我只是添加了一个 dimmingView 并更改了presentedViewController 的框架。

    最后,在呈现视图控制器之前进行连接,即将 modalPresentationStyle 更改为自定义并设置过渡委托。

我发现非常有用的东西,两个 2014 年 WWDC 视频(“查看控制器改进”和“查看演示控制器”)和来自 Apple 的示例项目(LookInside-photoEditingApp)。

【讨论】:

是否只有这样才能使其与 iOS 7 和 iOS 8 兼容,根据是否为 ​​iOS 8 添加两个完全独立的方法来呈现视图(带有相应的代码)?跨度> 是的,UIPresentationController 仅适用于 iOS 8。【参考方案3】:

您可以使用preferredContentSize 属性来代替子类化

- (void)viewDidLoad 
   [super viewDidLoad];

   self.preferredContentSize = CGSizeMake((self.view.frame.size.width / 100) * 65, (self.view.frame.size.height / 100) * 65);

【讨论】:

以上是关于ios 8 更改呈现/模态视图控制器的大小的主要内容,如果未能解决你的问题,请参考以下文章

从模态视图控制器中更改模态视图大小

当被模态视图控制器覆盖时,iOS 6 视图控制器布局在方向更改后不会更新

iiview 甲板控制器在呈现模态视图时更改框架而不更改界面方向

横向模式下的导航控制器堆栈,但总是以纵向帧大小模态呈现视图控制器视图

当每个新的视图控制器被推送时,调整导航控制器的大小以模态 UIModalPresentationFormSheet 呈现

呈现视图控制器中的方向更改未更新父视图控制器