将UIViewController呈现为具有透明背景的模态

时间:2014-10-27 22:43:46

标签: swift uikit

我正在尝试在iOS 7和iOS 8上呈现具有透明背景的viewcontroller。 只需将viewcontroller的modalPresentationStyle属性更改为FormSheet,我就可以在iOS 7.1上使用它。

我想要的是在ios7 +上的通用方法

我尝试过使用modalPresentationStyle的其他选项,例如:OverCurrentContext,CurrentContext和PageSheet。

我也试过使用modalPresentationStyle.Custom,但没有取得任何成功。

如果有任何帮助,我有NavigationController。

呈现视图控制器的代码:

InfoViewController *info = [[InfoViewController alloc] initWithNibName:@"InfoViewController" bundle:nil];
[self presentViewController:info animated:YES completion:nil];

所呈现的ViewController的viewDidLoad代码(我认为这与此有关):

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    self.modalPresentationStyle = UIModalPresentationStyle.PageSheet
}

我正在使用swift和Xcode 6。 这是我现在和我想要的截图:

enter image description here enter image description here

以下是一个示例代码:https://github.com/pbassut/TransBackgroundViewController

8 个答案:

答案 0 :(得分:18)

对于那些在呈现UIViewController之前仍然存在此问题的人,将呈现的UIViewController的modalPresentationStyle设置为.Custom,它将在iOS 8(Xcode 6.1)上运行。也就是说,你应该在呈现UIViewController

中设置它

答案 1 :(得分:11)

我尝试过这个解决方案,它适用于iOS 7和8:

if (UIDevice.currentDevice().systemVersion.integerValue >= 8)
{
    //For iOS 8
    presentingViewController.providesPresentationContextTransitionStyle = true;
    presentingViewController.definesPresentationContext = true;
    presentedViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
}
else
{
    //For iOS 7
    presentingViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
}

注意: 请注意' presentsViewController '和' presentsViewController '之间的区别。

答案 2 :(得分:6)

我能够在没有代码的情况下实现这一目标:

  1. 在故事板中,在呈现视图控制器上(即在您想要透明的那个之前),转到属性检查器。在该选项卡上,有“定义上下文”和“提供上下文”的复选框。检查那些。

  2. 在segue上,将其设置为“当前模态”。

  3. 在目的地/呈现的视图控制器上,转到属性选项卡。在“Presentation”下拉列表中,选择“Over Current Context”。

  4. 在目标视图控制器上,将其视图设置为具有清晰背景。

  5. 在目标视图控制器上,打下2个UIViews:一个是你的“透明”,另一个是你的“内容”。将透明的一个设置为您喜欢的任何alpha,并将所有垃圾放入“内容”中。

答案 3 :(得分:5)

以上都不适合我。为了在iOS 10上运行,我只需: presented.modalPresentationStyle = .overFullScreen presenting.present(presented, animated: true) 然后将呈现的视图控制器的根视图设置为透明或半透明颜色。不要更改其alpha或其所有子视图将具有相同的alpha。

答案 4 :(得分:4)

通过以下步骤,我在Swift 2.0中实现了各种样式的透明化。分析它以与您的代码兼容。

当按钮单击主视图控制器时,透视视图控制器(模态视图控制器)由segue启动。

Segue设置:

enter image description here

在主视图控制器中:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{
 let vc = segue.destinationViewController as! ModalViewController
 vc.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext //All objects and view are transparent
}

StoryBoard上的模态视图控制器:

  1. 如果您需要视图且所有对象都是透明的
  2. enter image description here

    1. 如果您只需要视图透明且对象不透明
    2. enter image description here

      在模态视图控制器上

      override func viewDidLoad() {
      super.viewDidLoad()
      
      view.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.8) //view only black coloured transparent
      
      }
      

      示例屏幕截图:

      1. 查看对象是透明的
      2. enter image description here

        1. 仅查看透明
        2. enter image description here

          如有任何其他疑问,请在此处评论:)

          如果您对透明视图控制器感到困惑或更多,那么在Youtube上为您提供watch my video tutorial:D

答案 5 :(得分:2)

<强> iOS8上+

下面的代码片段将解决iOS8 +中的这个问题

SecondViewController *secondViewController = [[SecondViewController alloc] init];
secondViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;           
[self presentViewController:secondViewController animated:YES completion:nil];    

答案 6 :(得分:0)

我有类似的问题,我想做一些类似于你在这里展示的第二个截图(巴西/葡萄牙报纸!)

我这样解决了。我插入了一个覆盖整个视图控制器的UIView,然后我转到了属性检查器,我将UIView的背景颜色设置为黑色,不透明度为50%。然后,我在第一个上面插入了另一个UIView,并且我在那个上面工作了

答案 7 :(得分:0)

如果您更改视图 alpha,它将应用于其子视图,因为它理解整个视图是透明的。 简单的解决方案是改变它的颜色,降低不透明度。只需选择您的背景颜色即可自定义

selecting background colour

然后选择 RGB 滑块,选择颜色并降低不透明度。

colour selection