7

ho impostare il colore personalizzato alla barra di navigazione di QLPreviewController ma il problema è che voglio colore scuro della barra di navigazione in QLPreviewController anche io ho posto la barra di navigazione di proprietà traslucido su No Ma io non so perché non funzionaQLPreviewController NavigationBar setTranslucent proprietà non lavora

lo voglio immagine belowed

enter image description here

come ma mostra come questa immagine

enter image description here

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

anche Ho anche provato come questo, ma non sta lavorando anche

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

Si prega di suggerire me dove sto andando male Grazie in anticipo

+0

e soluzioni? –

risposta

8

Il problema principale è che quando provi a impostare la traslucenza della barra di navigazione, non hai ancora premuto il controller di anteprima sulla pila di navigazione. A questo punto, il controller di anteprima viene allocato e istanziato, ma la sua vista non è stata caricata o aggiunta alla gerarchia della vista e il valore di previewer.navigationController è nullo. Il valore di self.navigationController è non nil a questo punto, ma la proprietà di traslucenza impostata qui verrà sovrascritta come effetto collaterale della pressione del controller di anteprima. Il modo più semplice per ottenere l'effetto desiderato, è quello di scambiare l'ordine delle istruzioni, in questo modo:

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

notano che con la traslucenza della barra di navigazione impostata su NO, il contenuto in anteprima inizierà sotto il barra di navigazione, che probabilmente non è quello che vuoi. Il modo più semplice per ovviare a questo problema è impostare la proprietà di traslucenza dopo la visualizzazione del controller di anteprima è stata visualizzata sullo schermo. È possibile effettuare questa operazione sottoclasse QLPreviewController:

@interface PreviewController : QLPreviewController 

@end 

@implementation PreviewController 

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

    self.navigationController.navigationBar.translucent = NO; 
} 

Si noti che le cose si fanno più complicate se l'utente è modale anteprima di controllo (invece di spingerlo su una pila di navigazione). In tal caso, non è disponibile alcun controller di navigazione per accedere alla barra di navigazione ed è necessario fare affidamento sulla gerarchia della vista interna di QLPreviewController. Il seguente codice funziona in iOS7, ma potrebbe rompersi in una versione successiva: non

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

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

}]; 
0

Invece di usare QLPreviewController, y Usi WebView per caricare il pdf.But se si carica il pdf in WebView è necessario personalizzare i pulsanti è quello. Anche questo è molto simile a QLPreviewController.

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

Bene, provalo una volta.

+0

WebView non supporta l'opzione di condivisione, quindi non viene utilizzato/preferito. –

+0

A partire da iOS 10, sia UIWebView che WKWebView hanno problemi di perdita di memoria, in cui viene perduta la memoria assegnata al PDF decompresso. IMO lo rende inutilizzabile. –

2

Nessuna necessità di sottoclasse.provare questo:

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

Se vuoi presentarlo modale, appena messo il previewController in un navigationController:

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

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