2012-09-24 15 views
11

mi objetivo es utilizar QLPreviewController en mi aplicación de iPad para iOS6, utilizando mi botón de elemento de acción personalizado en la barra de herramientas superior. Tenía solución hasta iOS5.1. He utilizado una clase que extiende QLPreviewController y durante el ciclo de vida del componente que hice algo así comoBotón CustomItem de navegación con QLPreviewController en iOS6

[[self navigationItem] setRightBarButtonItems:[NSArray arrayWithObject:[self buildCustomButton]]]; 

Con iOS6 este truco no funciona más, y ahora parece imposible el cambio de configuración navigationItem. Creo que la introducción de UIActivity and Social Framework podría estar involucrada y quizás no sea más efectivo trabajar en navigationItem, pero puedo encontrar cualquier solución. ¿Alguna sugerencia? Gracias, bye

+0

Problema similar: http://stackoverflow.com/questions/12568508/custom-view-in-tab-bar-does-no-longer-work-in-ios6 – mark

+0

Tengo el mismo problema. Tratando de resolver ... – wzbozon

+0

Tiene el mismo problema. Parece que ya no puede reemplazar o eliminar el botón Compartir estándar. – Aron

Respuesta

0

He intentado durante mucho tiempo reemplazar este botón. Miró a las subvistas, etc. Parece que este botón acciones/compartir se coloca como una capa para el navegador. bar. Terminé resolviendo este problema yo mismo al agregar un botón más en lugar de título en la subclase QLPreviewController.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Button in center of Navigation Bar 
    UISegmentedControl *button = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:LS(@"Save"), nil]]; 
    button.frame = CGRectMake(0, 0, 100, 30); 
    button.center = self.view.center; 
    button.momentary = YES; 
    button.segmentedControlStyle = UISegmentedControlStyleBar; 
    button.tintColor = [UIColor colorWithHue:0.6 saturation:0.33 brightness:0.69 alpha:0]; 
    [button addTarget:self action:@selector(saveToDocumentsClicked) forControlEvents:UIControlEventValueChanged]; 
    self.navigationItem.titleView = button; 
} 
+0

una solución alternativa que encontré es agregar QLPreviewController como subView de pantalla completa a mi UIViewController, junto con una UINavigationBar, que puedo configurar como me gusta. Sigue siendo comprensivo cuando el usuario toca QLPreviewController, para ocultar y mostrar la barra de navegación. Intenté con los métodos stardard uiviewcontroller (touchesBegan, touchesMove, touchesMove) y gestor de gestos, pero parece difícil de interceptar cuando el usuario toca ese componente. – bovello

1

Bueno, tengo buenas y malas noticias.

La buena noticia es que he descubierto por qué esto no funciona. En iOS6 navigationItem del QLPreviewController ya no tiene un navigationbar:

(lldb) po [[self navigationItem] navigationBar]; 
(id) $2 = 0x00000000 <nil> 

La barra de navegación se encuentra ahora en lo profundo de la vista de jerarquía de la QLPreviewControllersView:

QLPreviewViewController.view-> UIView-> UIView-> QLRemotePreviewContentController- > navBar-> navItem-> rightBarButtonItems.

Usted puede utilizar el método siguiente para encontrar la navigationItem que está buscando:

- (void)inspectSubviewsForView:(UIView *)view 
{ 
    for (UIView *subview in view.subviews) 
    { 
     if ([subview isKindOfClass:[UINavigationBar class]]) 
     { 
      UINavigationBar *bar = (UINavigationBar *)subview; 
      if ([[bar items] count] > 0) 
      { 
       UINavigationItem *navItem = [[bar items] objectAtIndex:0]; 
       [navItem setRightBarButtonItem:nil]; 
      } 
     } 

     if ([subview isKindOfClass:[UIView class]] && [[subview subviews] count] > 0) 
     { 
      [self inspectSubviewsForView:subview]; 
     } 
    } 
} 

Basta con pasar [Ver auto] a ese método y se hará en bucle hasta que encuentra la barra de pestañas en cuestión. Luego puede eliminar o agregar el suyo.

Las malas noticias son, por supuesto, que está accediendo a API privadas y su uso probablemente hará que su aplicación sea rechazada por la tienda de aplicaciones. Sin embargo, es la única respuesta que he visto en esto. Me encantaría ver si hay una forma no privada de hacerlo, pero dada la forma en que está configurado, parece poco probable.

Además, este método solo funcionará si se invoca después de que la barra ya está en posición. El mejor lugar para llamar esto es 'viewDidAppear', pero no funciona el 100% del tiempo.

+0

En un UIDocumentInteractionController el QLPreviewController solo tiene * QLPreviewViewController.view-> UIView *, así que tengo que seguir usando mi solución de categoría hacky: -/ – tougher

+0

Sí, no pude encontrar UINavigationBars en ninguna de las subvistas. Incluso intenté ir a super.view.subviews (desde que subclass QLPreviewController) – valheru

6

Realmente necesitaba una solución, así que lo inventé.

Sí, es feo. Sí, puede romperse en cualquier momento. Y sí, me iré directo al infierno, pero mi jefe dejó de mirarme con ojos enojados ... por ahora.

@implementation UINavigationItem (Custom) 

void MethodSwizzle(Class c, SEL origSEL, SEL overrideSEL); 

- (void) override_setRightBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated{ 
    if (item && [item.target isKindOfClass:[QLPreviewController class]] && item.action == @selector(actionButtonTapped:)){ 
     QLPreviewController* qlpc = (QLPreviewController*)item.target; 
     [self override_setRightBarButtonItem:qlpc.navigationItem.rightBarButtonItem animated: animated]; 
    }else{ 
     [self override_setRightBarButtonItem:item animated: animated]; 
    } 
} 

+ (void)load { 
    MethodSwizzle(self, @selector(setRightBarButtonItem:animated:), @selector(override_setRightBarButtonItem:animated:)); 
} 

void MethodSwizzle(Class c, SEL origSEL, SEL overrideSEL) { 
    Method origMethod = class_getInstanceMethod(c, origSEL); 
    Method overrideMethod = class_getInstanceMethod(c, overrideSEL); 

    if (class_addMethod(c, origSEL, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) { 
     class_replaceMethod(c, overrideSEL, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); 
    }else{ 
     method_exchangeImplementations(origMethod, overrideMethod); 
    } 
} 

@end 

Steve Jobs me va a cazar en mis sueños hasta que encuentre una solución adecuada ...

+0

BTW: utilizo un UIDocumentInteractionController, no un QLPreviewController directamente. – tougher

+1

Si desea eliminar el botón de acción, cambie * qlpc.navigationItem.rightBarButtonItem * a * nil *. – tougher

+1

No necesita disculparse solo porque Apple no proporciona la API adecuada para la personalización ... – HyBRiD

2

Funciona si va a cambiar el botón de punto de acción en la barra de herramientas superior que tendría que hacerlo dentro

-(void)viewDidAppear:(BOOL)animated{ 
    //add code necessarry to change your action buttons of toptoolbar in quicklook 
} 

Después de que aparezca la vista rightBarButtonItems se puede acceder.

+0

El botónBarBar derecho aparece después de finalizar la carga de PDF.A veces fallará. –

1

La mejor manera es implementar su propio controlador y utilizar la vista de QLPreviewController como subvista. En ese caso, puede crear su propia barra de navegación con elementos personalizados.

Cuestiones relacionadas