IOS 7:添加具有透明度的模态 ViewController:自定义大小

Posted

技术标签:

【中文标题】IOS 7:添加具有透明度的模态 ViewController:自定义大小【英文标题】:IOS 7 : Adding modal ViewController with transparency : Custom Size 【发布时间】:2014-05-05 11:38:48 【问题描述】:

我想要做的是呈现一个来自底部并具有自定义大小的 viewController。无论我做什么,要么看起来很糟糕(例如它的动画,闪烁然后变透明),要么全屏显示,要么使整个屏幕变黑。我已经阅读了一些自定义委托处理动画的解决方案,但必须有一个简单的方法。还有很多解决方案适用于 ios 6

    HackViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"HackViewController"];
   vc.delegate = self;
   vc.modalPresentationStyle= UIModalPresentationCustom;
   vc.view.frame = CGRectMake(0, 0, 800, 400);
   vc.credits = CREDIT_PER_LEVEL * building.buildingLevels;
   vc.view.backgroundColor = [UIColor clearColor];

   [self presentViewController:vc animated:YES completion:^
             vc.view.backgroundColor = [UIColor clearColor];
   ];

【问题讨论】:

我也在尝试相同的方法,但我得到的是呈现视图控制器隐藏了导航控制器的其他视图控制器。所以当你展示视图控制器并且它覆盖了整个屏幕时,它下面的所有其他视图控制器都会被隐藏并且它会失去透明度。 【参考方案1】:

如果您想将 viewController(例如 VC2)作为模式添加到第一个 viewController(例如 VC1)之上,那么在 VC1 中,当您呈现 VC2 时,

[self presentViewController:VC2 animated:YES completion:nil];

VC2 viewDidLoad

[self.view setBackgroundColor:[UIColor colorWithRed:211.0/255.0 green:211.0/255.0 blue:211.0/255.0 alpha:0.8]];

并且,在AppDelegateapplication didFinishLaunchingWithOptions:

[[self.window rootViewController] setModalPresentationStyle:UIModalPresentationCurrentContext];

您可以在VC2

中创建imageViewlabel等其他视图

【讨论】:

这给了我有趣的结果,我以模态方式呈现游戏,因此它实际上隐藏了游戏视图并向我显示菜单,公平地说,这是我的问题而不是你的代码 所以VC1(菜单)呈现VC2(游戏)。然后VC2呈现VC3(游戏选项)。用你的方法,VC3的背景是vc1 是的,,,但是如果你不想显示VC1背景,将alpha属性设置为VC3的背景颜色[self.view setBackgroundColor:[UIColor colorWithRed:211.0/255.0 green:211.0/255.0 blue:211.0/255.0 alpha:1.0]]; 我想通过VC3看VC2 你想要透明的VC,让它的alpha低【参考方案2】:

如果您只想支持 iOS7 及更高版本,您可以使用自定义模态演示样式 (UIModalPresentationCustom) 来实现这一点,并实现 transitioningDelegate 以返回一个过渡控制器。在过渡控制器中,当呈现发生时将调用您,您可以提供呈现的视图控制器的目标框架。这对使用系统表示模型有很大的好处,并且系统知道控制器已经被展示了。

如果你需要支持iOS6,你需要将呈现的视图控制器添加为子视图,视图控制器作为呈现视图控制器的子视图控制器,并自己管理视图层次结构。由于手动视图层次控制和子/父视图控制器,这不是最佳的。

【讨论】:

【参考方案3】:

你不必presentViewController:,你可以用addSubview:做到这一点 继续做你正在做的事情,但将vc 的视图添加到呈现的视图控制器的视图中,而不是使用presentViewController: 呈现vc

如果你在动画块中这样做,它会很好看。

【讨论】:

我知道你可以那样做,但是你需要做所有的 addChildViewController didMoveToParentViewController:nil 等等。有没有办法用 presentViewController 做到这一点

以上是关于IOS 7:添加具有透明度的模态 ViewController:自定义大小的主要内容,如果未能解决你的问题,请参考以下文章

iOS:具有透明背景的模态 ViewController

iOS 7 半透明模态视图控制器

iOS - 半透明模态视图控制器

具有透明背景的模态 UISplitViewController

iOS 7状态栏半透明,具有向后兼容性

iOS - 带有动画的程序化模态segue(例如翻转)