2010-07-15 15 views
10

Estoy usando las nuevas capacidades de personalización del UIMenuController para agregar cosas que no sean "Copiar" al menú para cortar & pegar en una vista web.Problemas que muestran UIMenuController uno tras otro

Lo que hago es obtener la referencia al UIMenuController compartido, configurar mi NSArray de UIMenuItems en los elementos del menú, y todo funciona bien siempre que agregue un solo elemento. Por ejemplo, veo [COPY | FOOBAR].

En cambio, si intento agregar más de un elemento, lo que sucede es que veo [COPY | MORE], si presiono en MÁS que finalmente aparecerán los otros elementos.

¿Es posible mostrar directamente [COPY | FOO | BAR | THREE | FOUR]? Vi algunas aplicaciones que pueden hacer esto, especialmente iBooks.

Cualquier ayuda muy apreciada, gracias.

Saludos, sissensio

Respuesta

15

La respuesta de fluXa es correcta, pero no creo que haya sido muy clara.

El problema es que al agregar objetos UIMenuItem personalizados al controlador de menú compartido ([UIMenuController sharedMenuController]), solo se mostrará el primer UIMenuItem personalizado en la pantalla inicial del menú. Los elementos de menú personalizados restantes se mostrarán si el usuario toca "Más ...".

Sin embargo, si el menú no incluye ningún elemento del menú del sistema incorporado (copiar :, pegar :, etc.), la pantalla del menú inicial mostrará todos los elementos de menú personalizados y ningún elemento "Más ..." .

Si necesita incluir los elementos del sistema incorporados, simplemente agregue UIMenuItems personalizados que tengan el mismo título pero con un selector diferente. (myCopy: vs.copia:)

En esencia se reduce a no llamar a la implementación predeterminada de canPerformAction: withSender :, manejar de forma explícita todos los elementos de menú personalizado, y volviendo NO para todos los otros elementos del menú (sistema suministrado):

- (BOOL) canPerformAction:(SEL)action withSender:(id)sender 
{ 
    if (action == @selector(onCommand1:)) 
    { 
     // logic for showing/hiding command1 
     BOOL show = ...; 
     return show; 
    } 

    if (action == @selector(onCommand2:)) 
    { 
     // logic for showing/hiding command2 
     BOOL show = ...; 
     return show; 
    } 

    if (action == @selector(onCopy:)) 
    { 
     // always show our custom "copy" command 
     return YES; 
    } 

    return NO; 
} 
+0

Gracias por eso. ¡Parece un detalle algo importante para dejar fuera de la documentación! –

4

que tienen el mismo problema en realidad cuando he intentado desarrollar una aplicación en el iPad. Pero lo que hice es He desactivado los elementos del menú emergente en

  • (BOOL) canPerformAction: (SEL) acción withSender: (id) emisor

Usando

if ([UIMenuController sharedMenuController]) { [UIMenuController sharedMenuController] .menuVisible = NO; } devuelve NO;

Luego utilicé un UIPopoverController.

Saludos, ZaldzBugz

+0

Eso es muy inteligente. Quizás debería probarlo. –

+0

Entonces, ¿supongo que iBooks usa una llamada API no documentada para mostrar su menú emergente? ¿O probablemente implementaron un componente personalizado para ello? – adib

2

se encontró con el mismo problema y lo que hice fue reemplazar la vista web con una subclase (sí sé que no debería) y volver NO para canPerformAction: para la copia: selector. Luego agregué mi propio elemento Copiar al ShareMenuController que llama al método original desde UIWebview. De esa forma, se pueden agregar tantos elementos como desee y son inicialmente visibles.

0

puede obtener el rect del UIMenuController que se muestra anteriormente utilizando el Marco del menú (propiedad de solo lectura), con eso puede calcular la posición de otro UIMenuController que se mostrará en el mismo lugar.

En el método de acción en el que está a punto de mostrar el segundo UIMenuController, obtener el marco de la UIMenuController anterior

enter image description here

CGRect previousRect = [[UIMenuController sharedMenuController] menuFrame]; 

CGRect newRect = CGRectMake(previousRect.origin.x + previousRect.size.width/2, previousRect.origin.y + previousRect.size.height, 0, 0); 

Aproximadamente obtendrá la posición de la flecha. Ahora mostrar la segunda UIMenuController

UIMenuItem *testMenuItem1 = [[UIMenuItem alloc] initWithTitle:@"test1" action:@selector(test1ItemClicked)]; 
UIMenuItem *testMenuItem2 = [[UIMenuItem alloc] initWithTitle:@"test2" action:@selector(test2ItemClicked)]; 


[[UIMenuController sharedMenuController] setMenuItems:@[testMenuItem1,testMenuItem2]]; 

UIMenuController *menuController = [UIMenuController sharedMenuController]; 

[menuController setTargetRect:newRect inView:_readerWebView]; 

[menuController setMenuVisible:YES animated:YES]; 

enter image description here

desde UIMenuController es un producto único, si desea mostrar los MenuItems anteriores, de nuevo hay que ajustarlos.

Cuestiones relacionadas