【问题标题】:iOS - presentViewController with transparencyiOS - 具有透明度的 presentViewController
【发布时间】:2012-08-09 19:02:47
【问题描述】:

我想以半透明的方式全屏显示视图控制器,以便我仍然可以看到它下面的视图。以下代码展示了新的视图控制器,但它替换了当前的。保持原始视图控制器可见的最佳方法是什么?新视图控制器的视图将具有半透明的黑色背景。

NewViewController* newVC = [[NSClassFromString(@"NewViewController") alloc] initWithNibName:deviceNib bundle:nil];
newVC.modalPresentationStyle = UIModalPresentationFullScreen;
newVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;


[self presentViewController:newVC animated:YES completion:NULL];

【问题讨论】:

    标签: ios uiviewcontroller


    【解决方案1】:

    呈现半透明视图,而不是视图控制器。

    mySemiTransparentView.alpha = 0.0f;
    [self.view addSubview:mySemiTransparentView];
    

    mySemiTransparentView 是您的全屏视图。您可以将其设置为动画:

    [UIView beginAnimations:@"fadeIn" context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationDuration:0.4f];
    mySemiTransparentView.alpha = 0.5f;
    [UIView commitAnimations];
    

    【讨论】:

    • 没错,但我想使用视图控制器。
    • 你仍然可以通过 alloc/init 实例化你的 UIViewController,然后 mySemiTransparentView 可以只是你的 ViewController.view
    • 除非您希望半透明视图上的所有内容都是 0.5 alpha(包括按钮等),否则不要设置视图的 alpha,因为它会级联到所有子组件。你最好创建一个占据整个屏幕的背景视图,它是 0.5 alpha,然后将你的按钮等分层。
    【解决方案2】:

    您可以通过以下方式呈现半透明模态控制器:

    NewViewController* newVC = [[NSClassFromString(@"NewViewController") alloc] initWithNibName:deviceNib bundle:nil];
    
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
    newVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    
    [self presentViewController:newVC animated:YES completion:NULL];
    

    请注意,您必须将常量 UIModalPresentationCurrentContext 设置为 self.modalPresentationStyle,而不是 newVC.modalPresentationStyle

    此外,当您使用 UIModalTransitionStyleCrossDissolve 时,newVC.view 的 alpha 将在过渡期间被覆盖,因此如果您想要半透明背景,则需要保持 newVC.viewbackgroundColor 清晰,只需添加另一个 UIView,因为它是具有半透明 backgroundColor

    的子视图

    【讨论】:

    • self.modalPresentationStyle = UIModalPresentationCurrentContext;newVC. modalPresentationStyle = UIModalPresentationCustomand + 1 也用于答案的第二部分。谢谢
    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多