我已将自定义颜色设置为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];
}
请建议我哪里出错了 在此先感谢
答案 0 :(得分:9)
主要问题是,当您尝试设置导航栏的半透明效果时,尚未在导航堆栈上推送预览控制器。
此时,预览控制器已分配并实例化,但其视图尚未加载或添加到视图层次结构中,previewer.navigationController
的值为nil。此时self.navigationController
的值不为零,但您在此处设置的半透明属性将被覆盖为推动预览控制器的副作用。获得所需效果的最简单方法是交换语句的顺序,如下所示:
[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;
}
}];
答案 1 :(得分:2)
不需要子类化。试试这个:
... = new Dictionary<Device, Response> { new Device() };
如果你想以模态方式呈现它,只需将previewController放入navigationController:
QLPreviewController * ql = [[QLPreviewController alloc] init];
...
[self showViewController:ql sender:self];
ql.navigationController.navigationBar.translucent = NO;
ql.edgesForExtendedLayout = UIRectEdgeNone;
答案 2 :(得分:0)
不使用QLPreviewController,你不使用webview来加载pdf.But如果你在webview中加载pdf你需要自定义它的按钮。它看起来也和QLPreviewController非常相似。
NSURL *targetURL = [NSURL fileURLWithPath:path_pdf]; //path_pdf is pdf's path
NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
[webview_pdf loadRequest:request];
好吧,试试一次。
答案 3 :(得分:0)
如果仍然有任何人想要自定义QLPreviewController
的导航栏,那么他们可以尝试创建UIViewController
并根据要求对其进行自定义,然后创建QLPreviewController
对象并将其添加为子视图控制器。
这将使您摆脱共享按钮,并自定义导航栏颜色等。这对我有用。
要了解如何添加子视图控制器,您可以参考this