QLPreviewController NavigationBar setTranslucent属性不起作用

Kal*_*era 5 iphone uinavigationbar uinavigationcontroller qlpreviewcontroller ios7

我已经将自定义颜色设置为QLPreviewController的导航栏,但问题是我想在QLPreviewController中使用深色的导航栏,即使我已将导航栏半透明属性设置为否但我不知道为什么它不起作用

我希望它像下面的图像

在此输入图像描述

但它显示像这个图像

在此输入图像描述

QLPreviewController *previewer = [[QLPreviewController alloc] init];
// Set data source
[previewer setDataSource:self];
[previewer setDelegate:self];
// Which item to preview
[previewer setCurrentPreviewItemIndex:index];
[previewer.view addGestureRecognizer:singleTap];
previewer.navigationController.navigationBar.translucent = NO;
previewer.navigationController.navigationBar.barTintColor = [UIColor redColor];
self.navigationController.navigationBar.translucent=NO;
self.navigationController.navigationBar.barTintColor = [UIColor redColor];
   [self.navigationController pushViewController:previewer animated:TRUE ];
Run Code Online (Sandbox Code Playgroud)

即使我也尝试过这样但它也没有用

    - (id <QLPreviewItem>)previewController: (QLPreviewController *)controller previewItemAtIndex:(NSInteger)index
{
// Break the path into it's components (filename and extension)
// Use the filename (index 0) and the extension (index 1) to get path
//lblFileName.text=[strFileName stringByReplacingOccurrencesOfString:@"movefile" withString:@""];

// For navigation bar color and text attributes of navigation bar
for (id object in controller.childViewControllers)
{
    if ([object isKindOfClass:[UINavigationController class]])
    {
        UINavigationController *navController = object;
        navController.navigationBar.translucent=NO;
        navController.navigationBar.barTintColor = [UIColor redColor];;
        navController.toolbar.translucent=NO;
        navController.toolbar.barTintColor=[UIColor redColor];;
        [navController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor], NSForegroundColorAttributeName, nil]];


    }
}

   NSString *strFilename=[[NSBundle mainBundle]pathForResource:@"final" ofType:@"png"];

return [NSURL fileURLWithPath:strFilename];
}
Run Code Online (Sandbox Code Playgroud)

请建议我在哪里出错我们提前谢谢

hve*_*ind 9

主要问题是,当您尝试设置导航栏的半透明度时,尚未在导航堆栈上推送预览控制器.此时,预览控制器已分配并实例化,但其视图尚未加载或添加到视图层次结构中,并且值为previewer.navigationControllernil.的价值self.navigationController为零,在这一点上,但您在此处设置半透明属性将被改写为推动预览控制器的副作用.获得所需效果的最简单方法是交换语句的顺序,如下所示:

[self.navigationController pushViewController:previewer animated:YES];
self.navigationController.navigationBar.translucent = NO;
Run Code Online (Sandbox Code Playgroud)

请注意,如果导航栏的半透明设置为NO,则预览的内容将从导航栏开始,这可能不是您想要的.解决该问题的最简单方法是在屏幕上显示预览控制器视图设置半透明属性.您可以通过继承QLPreviewController来完成此操作:

@interface PreviewController : QLPreviewController

@end

@implementation PreviewController

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    self.navigationController.navigationBar.translucent = NO;
}
Run Code Online (Sandbox Code Playgroud)

请注意,当您以模态方式呈现预览控制器时(而不是将其推送到导航堆栈上),事情变得更加复杂.在这种情况下,没有可用于访问导航栏的导航控制器,您需要依赖QLPreviewController的内部视图层次结构.以下代码适用于iOS7,但可能会在更高版本中出现:

[self presentViewController:previewController animated:YES completion:^{

    UIView *view = [[[previewController.view.subviews lastObject] subviews] lastObject];
    if ([view isKindOfClass:[UINavigationBar class]])
    {
        ((UINavigationBar *)view).translucent = NO;
    }

}];
Run Code Online (Sandbox Code Playgroud)