QLPreviewController NavigationBar setTranslucent 属性不起作用

Posted

技术标签:

【中文标题】QLPreviewController NavigationBar setTranslucent 属性不起作用【英文标题】:QLPreviewController NavigationBar setTranslucent property not working 【发布时间】:2013-11-16 05:45:44 【问题描述】:

我已将自定义颜色设置为 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 ];

即使我也尝试过这样,但它也不起作用

    - (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];

请建议我哪里出错了 提前致谢

【问题讨论】:

【参考方案1】:

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

[self.navigationController pushViewController:previewer animated:YES];
self.navigationController.navigationBar.translucent = NO;

请注意,将导航栏的半透明设置为 NO,预览的内容将在导航栏下方开始,这可能不是您想要的。解决该问题的最简单方法是在预览控制器的视图出现在屏幕上之后设置半透明属性。你可以通过继承 QLPreviewController 来做到这一点:

@interface PreviewController : QLPreviewController

@end

@implementation PreviewController

- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];

    self.navigationController.navigationBar.translucent = NO;

请注意,当您以模态方式呈现预览控制器(而不是将其推送到导航堆栈上)时,事情会变得更加复杂。在这种情况下,没有可用于访问导航栏的导航控制器,您需要依赖 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;
    

];

【讨论】:

【参考方案2】:

不需要子类化。试试这个:

 QLPreviewController * ql = [[QLPreviewController alloc] init];
...
[self showViewController:ql sender:self];
ql.navigationController.navigationBar.translucent = NO;
ql.edgesForExtendedLayout = UIRectEdgeNone;

如果你想以模态方式呈现,只需将 previewController 放入 navigationController 中即可:

UINavigationController * navi = [[UINavigationController alloc] initWithRootViewController:ql];
        ql.navigationController.navigationBar.translucent = NO;
        ql.edgesForExtendedLayout = UIRectEdgeNone;

        [self presentViewController:navi animated:YES completion:nil];

【讨论】:

【参考方案3】:

你不使用 QLPreviewController,而不是使用 webview 加载 pdf。但是如果你在 webview 中加载 pdf,则需要自定义按钮。它看起来也非常类似于 QLPreviewController。

 NSURL *targetURL = [NSURL fileURLWithPath:path_pdf]; //path_pdf is pdf's path 
 NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
 [webview_pdf loadRequest:request];

好吧,试一次。

【讨论】:

WebView 不支持共享选项,所以不使用/不推荐。 从 iOS 10 开始,UIWebView 和 WKWebView 都存在内存泄漏问题,即分配给解压 PDF 的内存泄漏。 IMO 这使它无法使用。【参考方案4】:

如果仍然有人想自定义QLPreviewController 的导航栏,那么他们可以尝试创建一个UIViewController 并根据需要对其进行自定义,然后创建QLPreviewController 对象并将其添加为子视图控制器。

这将使您摆脱共享按钮并自定义导航栏颜色等。这对我有用。

要知道如何添加子视图控制器可以参考this

【讨论】:

以上是关于QLPreviewController NavigationBar setTranslucent 属性不起作用的主要内容,如果未能解决你的问题,请参考以下文章

iOS7 QLPreviewController 改变导航栏颜色?

在 QLPreviewController 中禁用复制操作

SwiftUI 中的 QLPreviewController 缺少导航栏

QLPreviewController 在其上显示模态视图控制器后失去联系

iOS - QLPreviewController 延迟

QLPreviewController NavigationBar barTintColor