【问题标题】:Push ViewController with transparent background以透明背景推送 ViewController
【发布时间】:2016-05-01 20:19:06
【问题描述】:

我想在我的应用中使用模糊图像作为固定背景。我的 ViewController 结构是这样的:

HostViewController(带有背景图片和 VisualEffectView)
– NavigationController(以模式方式呈现在 HostViewController 上)
–– ViewController(背景颜色清晰)

当我想从 NavigationController 推送到另一个 ViewController(也具有清晰的背景颜色)时,新的 ViewController 会与通过新 ViewController 可见的第一个 ViewController 重叠。这看起来很奇怪和丑陋。我的问题是如何在没有 ViewController 相互重叠的情况下实现具有固定背景的推送动画?

您可以在 App Store 中的应用程序“TuneShell”中看到此效果的示例。

在此先感谢您,费边。



编辑: 为了澄清我的问题,我添加了这个 gif:

正如您在 gif 中看到的,当我推送到 Playlist-ViewController 时,rootViewController 在动画时通过新的 Playlist-ViewController 可见。我想解决这个问题。



我想要达到的目标:

【问题讨论】:

  • 你必须在 -didFinishLaunching 里面的 AppDelegate.m 中添加窗口中的背景。
  • @0yeoj 谢谢,但这不是我真正的问题。我已经编辑了我的问题,以便您更好地理解我的问题。
  • 啊..我明白了..你试过在-viewWillDisappear里面设置self.view.alpha = 0吗?
  • @0yeoj 是的,我试过了,但这不是我想要达到的效果。我再次编辑了我的问题。
  • 视图的剪辑到边界属性可能未为第一个视图设置。如果你这样做,这将得到解决。您不必为了解决此问题而进行答案中提到的此类自定义。如果这就是你想要的。

标签: ios objective-c iphone xcode uiviewcontroller


【解决方案1】:

我对此有一个解决方案,但我认为这不是最好的解决方案,请记住,这只是一种解决方法。

首先要做的是设置你的global 背景:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    ..
    self.window.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blur.jpeg"]];

    return YES;
}

blur.jpeg 是一个清晰(不模糊)的图像,例如我正在使用它(从谷歌获得)

接下来是子类化 UIViewController 以供全球使用,但如何在全球范围内实现它取决于您。

//BGBlurViewController.h
//
@interface BGBlurViewController : UIViewController

@end

//BGBlurViewController.m
//
@implementation BGBlurViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    UIToolbar *background = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    [background setBarStyle:UIBarStyleBlackTranslucent];
    [self.view addSubview:background];
    [self.view sendSubviewToBack:background];
}

@end

我用UIToolbar作为UIViewController的背景,实现模糊效果。


这是如何使用子类UIViewController(BGBlurViewController)

//RootViewController
//
#import "BGBlurViewController.h"

@interface ViewController : BGBlurViewController

@end

还有一个:

//View next to rootViewController
//
#import "BGBlurViewController.h"

@interface ViewController2 : BGBlurViewController

@end

注意: 我在故事板中将 UIViewControllers(ViewController 和 ViewController2)的 backgroundColor 设置为 Default/none,这只是一种解决方法......


这是运行时的示例输出:

希望这会对你有所帮助.. 干杯..

【讨论】:

  • @FTFT1234 真是个聪明的把戏 :) 你知道幕后发生了什么吗?为什么它只适用于 UIToolbar?你有没有找到一个不那么“变通”的解决方案:)?
  • @ospr;实际上,它仅适用于 UIToolbar,您可以将 UIImageView 与半透明图像一起使用,但我更喜欢使用 UIToolbar。真正发生的是,他真的不希望self.view 完全透明,而是在保持半透明的同时覆盖它后面的视图控制器......如果你们找到更好的技巧,请告诉我,只是为了我的启发。
  • @0yeoj 酷。是的,当您在视图控制器之间制作动画时,UIToolbar 似乎总是在正确的位置显示窗口的背景。似乎在这种观点中发生了一些特别的事情。我尝试了一个带有半透明图像的 UIImageView,并且在转换时底部视图控制器显示在后面的地方遇到了 FTFT1234 的原始问题。不幸的是,我的用例要求视图控制器以模态方式定位在背景视图控制器上,而 UIToolbar 技巧似乎不起作用。如果我发现任何其他内容,会通知您。
  • 你让我很开心,不知道你是怎么找到这个技巧的!这个 UIToolbar 肯定有一些特别的地方,当用户动态滑动时背景是固定的,所以它不是在后面添加的“正常”背景
猜你喜欢
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
相关资源
最近更新 更多