当前位置:  开发笔记 > 编程语言 > 正文

如何使用presentModalViewController创建透明视图

如何解决《如何使用presentModalViewController创建透明视图》经验,为你挑选了10个好方法。

我正在显示模态视图

[self presentModalViewController:controller animated:YES];

当视图向上移动屏幕时,它根据创建的xib文件中的设置是透明的,但是一旦它填满屏幕就会变得不透明.

有没有保持视图透明?

我怀疑它被放置的视图没有被渲染,而是模态视图变得不透明.



1> Infinite Pos..:

在iOS 3.2之后,有一种方法可以在没有任何"技巧"的情况下执行此操作 - 请参阅modalPresentationStyle属性的文档.你有一个rootViewController,它将呈现viewController.所以这是成功的代码:

viewController.view.backgroundColor = [UIColor clearColor];
rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
[rootViewController presentModalViewController:viewController animated:YES];

使用此方法,viewController的背景将是透明的,底层的rootViewController将是可见的.请注意,这似乎只适用于iPad,请参阅下面的评论.


这似乎不适用于iPhone/iPod,只有iPad(请参阅答案中链接的文档).@simpleBob:也许这就是为什么它不适合你?
它不适合我(iOS 5.0),有人可以显示一些代码吗?

2> Ben Gottlieb..:

您的视图仍然是透明的,但是一旦您的模态控制器位于堆栈的顶部,它背后的视图就会被隐藏(就像任何最顶层的视图控制器一样).解决方案是自己手动设置视图动画; 那么后面的viewController将不会被隐藏(因为你不会'离开'它).


问题是所呈现的视图不能有自己的自动旋转设置.

3> 小智..:

我需要让它工作:

self.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;


显示背景视图 - 但没有动画.
您也可以在呈现视图控制器上设置`modalPresentationStyle`(而不是在窗口的`rootViewController`上).
请注意,正如T先生所说,必须在当前具有全屏的视图控制器上设置modalPresentationStyle.

4> Kristopher J..:

对于那些想看一些代码的人来说,这就是我添加到透明视图控制器中的内容:

// Add this view to superview, and slide it in from the bottom
- (void)presentWithSuperview:(UIView *)superview {
    // Set initial location at bottom of superview
    CGRect frame = self.view.frame;
    frame.origin = CGPointMake(0.0, superview.bounds.size.height);
    self.view.frame = frame;
    [superview addSubview:self.view];            

    // Animate to new location
    [UIView beginAnimations:@"presentWithSuperview" context:nil];
    frame.origin = CGPointZero;
    self.view.frame = frame;
    [UIView commitAnimations];
}

// Method called when removeFromSuperviewWithAnimation's animation completes
- (void)animationDidStop:(NSString *)animationID
                finished:(NSNumber *)finished
                 context:(void *)context {
    if ([animationID isEqualToString:@"removeFromSuperviewWithAnimation"]) {
        [self.view removeFromSuperview];
    }
}

// Slide this view to bottom of superview, then remove from superview
- (void)removeFromSuperviewWithAnimation {
    [UIView beginAnimations:@"removeFromSuperviewWithAnimation" context:nil];

    // Set delegate and selector to remove from superview when animation completes
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

    // Move this view to bottom of superview
    CGRect frame = self.view.frame;
    frame.origin = CGPointMake(0.0, self.view.superview.bounds.size.height);
    self.view.frame = frame;

    [UIView commitAnimations];    
}



5> Jeff C...:

在iOS 8中Apple批准的方法是将modalPresentationStyle设置为'UIModalPresentationOverCurrentContext'.

从UIViewController文档:

UIModalPresentationOverCurrentContext

一种演示样式,其中内容仅显示在父视图控制器的内容上.演示文稿完成后,不会从视图层次结构中删除所显示内容下方的视图.因此,如果呈现的视图控制器没有用不透明的内容填充屏幕,则底层内容会显示出来.

在弹出框中显示视图控制器时,仅当过渡样式为UIModalTransitionStyleCoverVertical时才支持此演示样式.尝试使用不同的过渡样式会触发异常.但是,如果父视图控制器不在弹出框中,则可以使用其他过渡样式(部分卷曲过渡除外).

适用于iOS 8.0及更高版本.

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/

来自WWDC 2014的"在iOS 8中查看控制器进展"视频详细介绍了这一点.

请务必为您呈现的视图控制器提供清晰的背景颜色(否则,它仍将显示为不透明).



6> Krumelur..:

还有另一种选择:在显示模态控制器之前,捕获整个窗口的屏幕截图.将捕获的图像插入UIImageView,并将图像视图添加到您即将显示的控制器视图中.然后发送回来.在图像视图上方插入另一个视图(背景黑色,alpha 0.7).显示你的模态控制器,看起来它是透明的.刚刚在运行iOS 4.3.1的iPhone 4上试过.喜欢魅力.



7> lucaslt89..:

这是相当古老的,但我解决了同样的问题如下:由于我需要在iPhone中提供导航控制器,添加子视图不是一个可行的解决方案.

所以我做了什么:

1)在呈现视图控制器之前,请截取当前屏幕的屏幕截图:

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * backgroundImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

2)创建要显示的视图控制器,并将背景添加为子视图,然后将其发送回去.

UIViewController * presentingVC = [UIViewController new];
UIImageView * backgroundImageOfPreviousScreen = [[UIImageView alloc] initWithImage:backgroundImage];
[presentingVC.view addSubview:backgroundImageOfPreviousScreen];
[presentingVC.view sendSubviewToBack:backgroundImageOfPreviousScreen];

3)展示您的视图控制器,但在此之前在新视图控制器中,在viewDidLoad中添加透明视图(我使用了ILTranslucentView)

-(void)viewDidLoad
{
    [super viewDidLoad];
    ILTranslucentView * translucentView = [[ILTranslucentView alloc] initWithFrame:self.view.frame];
    [self.view addSubview:translucentView];
    [self.view sendSubviewToBack:translucentView];
}

就这样!



8> Mr. T..:

我在另一个问题中写下了关于此问题的发现,但是要点是,您现在必须调用modalPresentationStyle = UIModalPresentationCurrentContext拥有全屏显示的所有内容。大多数时候,它是[UIApplication sharedApplication] .delegate.window的rootViewController。也可能是与一起提供的新UIViewController modalPresentationStyle = UIModalPresentationFullScreen

如果您想知道我是如何专门解决此问题的,请阅读我的其他更详细的文章。祝好运!



9> 小智..:

这似乎在IOS 8中被打破,我正在使用导航控制器,正在显示的上下文是导航菜单上下文,在我们的示例中是滑动菜单控制器.

我们正在使用pod'TWTSideMenuViewController','0.3'尚未检查这是否是库的问题或上述方法.



10> 小智..:

这在iOS 8-9中对我有用:

1-使用alpha设置视图控制器的背景

2-添加此代码:

TranslucentViewController *tvc = [[TranslucentViewController alloc] init];
self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
[tvc setModalPresentationStyle:UIModalPresentationOverCurrentContext];

[self.navigationController presentViewController:tvc animated:YES completion:nil];

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有