【问题标题】:Present UIViewController as a modal with transparent background将 UIViewController 呈现为具有透明背景的模态
【发布时间】:2014-12-23 06:05:13
【问题描述】:

我正在尝试在 iOS 7 和 iOS 8 上呈现具有透明背景的视图控制器。 只需将 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。 这是我现在拥有的和想要的截图:

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

【问题讨论】:

  • 你能发到 github 上让我们玩代码吗?
  • 你的意思是整个代码?
  • 只是相关部分不起作用,因此我们可以将其粘贴到新项目中并查看故障并进行更正。
  • 我很困惑。该项目正在加载一个带有黑色背景的 xib,位于带有绿色背景的视图之上。

标签: swift uikit


【解决方案1】:

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

【讨论】:

  • this 和 .overFullScreen 都适用于我(iOS 14),但是当视图控制器被关闭时,viewWillAppear not 在它下面的视图控制器上调用。当我使用 .fullScreen 时会调用它。为了两全其美,我可以发送通知并让所有相关的视图控制器订阅。
【解决方案2】:

我已经尝试过这个解决方案,它适用于 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;
}

注意:请注意“presentingViewController”和“presentedViewController”之间的区别。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • this 和 .custom(参见下面的答案)都适用于我(iOS 14),但是当视图控制器被关闭时,不会在它下面的视图控制器上调用 viewWillAppear。当我使用 .fullScreen 时调用它。为了两全其美,我可以发送通知并让所有相关的视图控制器订阅。
    【解决方案4】:

    我不用代码就可以做到这一点:

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

    2. 在 segue 上,将其设置为“Present Modally”。

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

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

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

    【讨论】:

    • 就我而言,这是正确的答案。
    • 这个,你甚至不需要额外的视图,如果你想要一些透明度,只需设置视图背景颜色不透明度
    【解决方案5】:

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

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

    转场设置:

    在主视图控制器中:

    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. 如果您需要视图并且所有对象都是透明的

    1. 如果您需要仅查看透明而对象不透明

    在您的模态视图控制器上

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

    示例截图:

    1. 对象的视图和上方是透明的

    1. 只看透明

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

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

    【讨论】:

      【解决方案6】:

      iOS8+

      下面的代码 sn -p 将在 iOS8+ 中解决这个问题

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

      【讨论】:

        【解决方案7】:

        我遇到了类似的问题,我想做一些类似于您在此处展示的第二个屏幕截图(巴西/葡萄牙语报纸!)

        我是这样解决的。我插入了一个覆盖整个 View Controller 的 UIView,然后我转到 Attributes Inspector 并将 UIView 的背景颜色设置为黑色,不透明度为 50%。然后,我在第一个 UIView 上方插入了另一个 UIView,然后我就在那个上面工作了

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-02-20
            • 1970-01-01
            • 2018-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-08
            相关资源
            最近更新 更多