2009-10-22 8 views
6

Hola, quiero crear un menú personalizado de burbujas, como menú cortar/copiar/pegar, en el iPhone SDK3.x. Sé que es UIMenuController pero solo proporciona el menú estándar de cortar/copiar/pasado. Alguien sabe cómo hacer un menú de burbujas similar a este. Cualquier ejemplo y código de referencia?Personalizar UIMenuController

Respuesta

-1

Use la propiedad menuItems en UIMenuController.

+0

En general, las respuestas son mucho más útiles si incluyen una explicación de lo que el código pretende hacer, y por qué eso resuelve el problema sin introducir otros –

39

1) es necesario agregar elementos de menú personalizado a la UIMenuController compartida:

UIMenuItem* miCustom1 = [[[UIMenuItem alloc] initWithTitle: @"Custom 1" action:@selector(onCustom1:)] autorelease]; 
UIMenuItem* miCustom2 = [[[UIMenuItem alloc] initWithTitle: @"Custom 2" action:@selector(onCustom2:)] autorelease]; 
UIMenuController* mc = [UIMenuController sharedMenuController]; 
mc.menuItems = [NSArray arrayWithObjects: miCustom1, miCustom2, nil]; 

2) que necesita para implementar los métodos de controlador en algún lugar de la cadena de respuesta de la opinión de que será de primera respuesta cuando se mostrar el menú:

- (void) onCustom1: (UIMenuController*) sender 
{ 
} 

- (void) onCustom2: (UIMenuController*) sender 
{ 
} 

3) que opcionalmente tiene que aplicar canPerformAction: en la cadena de respuesta de la opinión de que será de primera respuesta cuando se presenta el menú:

- (BOOL) canPerformAction:(SEL)action withSender:(id)sender 
{ 
    if (action == @selector(onCustom1:)) 
    { 
      return YES; // logic here for context menu show/hide 
    } 

    if (action == @selector(onCustom2:)) 
    { 
      return NO; // logic here for context menu show/hide 
    } 

    if (action == @selector(copy:)) 
    { 
      // turn off copy: if you like: 
     return NO; 
    } 

    return [super canPerformAction: action withSender: sender]; 
} 

4) si la vista para la que desea mostrar el menú ya no admite mostrar un menú, (es decir, un UIWebView mostrará un menú cuando el usuario hace un toque largo, pero un UILabel no tiene soporte incorporado para mostrar un menú), entonces necesita presentar el menú usted mismo. Esto se suele hacer mediante la fijación de un UILongPressGestureRecognizer a la vista, a continuación, muestra el menú de la devolución de llamada:

UILongPressGestureRecognizer* gr = [[[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector(onShowMenu:) ] autorelease]; 
    [_myview addGestureRecognizer: gr]; 



- (void) onShowMenu: (UIGestureRecognizer*) sender 
{ 
    [sender.view becomeFirstResponder]; 

    UIMenuController* mc = [UIMenuController sharedMenuController]; 

    CGRect bounds = sender.view.bounds; 

    [mc setTargetRect: sender.view.frame inView: sender.view.superview]; 
    [mc setMenuVisible: YES animated: YES]; 
} 

Nota, tiene que haber una visión que afirma firstResponder para el menú para mostrar.

5) asegúrese de que la vista que muestra el menú devuelve SÍ/VERDADERO a canBecomeFirstResponder. Por ejemplo, si intenta hacer que un UILabel sea el primer respondedor, devolverá NO, por lo que debería subclasificarlo.

6) eso es todo. Es posible que desee resignar FirstResponder cuando se llame a la devolución de llamada de acción, pero para hacerlo deberá implementar la lógica para descubrir el primer Respondedor.

+0

el remitente en canPerformAction no representa el objeto donde aparece el menú en/on (en mi caso una vista de texto) - ¿Alguna idea de por qué? – amok

+0

Bien respondido, ¡buen trabajo! – gigahari

+0

'- [FirstViewController handleGesture ::]: selector no reconocido enviado a la instancia 0x1e865800' para elemento enfocado en la página web. ¿Cómo arreglar este problema? Cuando ningún elemento dentro de la página se enfoca para ingresar texto, este método realmente funciona. – Dmitry

Cuestiones relacionadas