QLPreviewController导航栏的setTranslucent属性无法正常工作

7
我已经将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];
}

请告诉我我的错误在哪里 提前感谢。
4个回答

10

主要问题是当您尝试设置导航栏的半透明度时,您还没有将预览控制器推入导航堆栈。

此时,预览控制器已分配和实例化,但其视图尚未加载或添加到视图层次结构中,并且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];

0

不妨使用webview来加载pdf,而不是使用QLPreviewController。但是,如果您在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不支持分享选项,因此它不被使用/推荐。 - jeet.chanchawat
从 iOS 10 开始,UIWebView 和 WKWebView 都存在内存泄漏问题,其中分配给解压缩的 PDF 的内存会泄漏。我认为这使其无法使用。 - Sam Clewlow

0

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

这将允许您摆脱共享按钮,并自定义导航栏颜色等。这对我很有效。

要了解如何添加子视图控制器,您可以参考this


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接