UITextView y UIPickerView con su propio UIToolbar

Me gusta para replicar el comportamiento del formulario de Safari en el iPhone en mi propia app. Si usted ingresa los datos en un formulario web puede obtener una UIToolbar (anterior, siguiente, de hecho), justo encima de la UIKeyboardView. Mismo para la elección de una opción: tienes el mismo UIToolbar justo por encima de un UIPickerView.

Estoy buscando demos /sourcode /ideas de cómo implementar esto. Podría yo crear mi propio subvista con la barra de herramientas y textview /pickerview? Hay una forma más elegante? Especialmente algo que aprovecha becomeFirstResponder de UITextfield?

OriginalEl autor luebken | 2009-05-19

2 Kommentare

  1. 13

    Así que he creado un UIViewCOntroller subclase para manejar esto.

    en que escribí esta función para agregar.

    -(void) addToViewWithAnimation:(UIView *) theView
    {
        UIView* myview = self.view;
        CGRect frame = myview.frame;
        frame.origin.y = 420;
        myview.frame = frame;
    
        UIView* bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 420)];
        bgView.backgroundColor = [UIColor blackColor];
        bgView.alpha = 0.6;
        backgroundView = bgView;
        [theView addSubview: bgView];  //this adds in the dark background
    
        [theView addSubview:self.view]; //this adds in the pickerView with toolbar.
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.5];  
        frame = myview.frame;
        frame.origin.y = 420 - frame.size.height;
        myview.frame = frame;
    
        [UIView commitAnimations];
     }

    Entonces creé la vista en IB, aquí es lo que mi Encabezado de la clase de parecido en el final de eso. (también hay un UItoolbar en el punto de vista que simplemente no tienen una referencia a ella en mi Controlador)

    @interface PropertyPickerController : UIViewController {
        IBOutlet UIPickerView* Picker;
        IBOutlet UIButton* DoneButton;
        IBOutlet UIButton* CancelButton;
        UIView* backgroundView;
        NSArray* SimpleObjects;
        id PickerObjectDelegate;
        SEL PickerObjectSelector;
    }

    Para, a continuación, ocultar la vista, yo uso.

    -(void) removeFromSuperviewWithAnimation
    {
    
        UIView* myview = self.view;
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDidStopSelector:@selector(AnimationDidStop:)];
        [UIView setAnimationDuration:0.5];  
        //set fram below window.   
        CGRect frame = myview.frame;
        frame.origin.y = 420;
        myview.frame = frame;
        backgroundView.alpha = 0;  //fades shade to nothing
        [UIView commitAnimations];
    }
    
    -(void) AnimationDidStop:(id) object
    {
        [self.view removeFromSuperview];  //removes view after animations.
        [backgroundView removeFromSuperview];
    }

    Y por último pero no menos importante, todas las funciones de delegado para el selector.

        - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
        {
            FBSimpleObject* object = (FBSimpleObject*)[SimpleObjects objectAtIndex:row];
            return object.Name;
        }
    
        - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
        {   
        }
        - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
        { return 1;}
    
        - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
        {
            return [SimpleObjects count];
        }
    
        - (IBAction)CancelButtonClick
        {
                [self removeFromSuperviewWithAnimation];
        }
        - (IBAction)DoneButtonClick
        {   
    //This performs a selector when the done button is clicked, makes the controller more versatile.
    if(PickerObjectDelegate && PickerObjectSelector)
            {
                NSMethodSignature* signature = [PickerObjectDelegate methodSignatureForSelector:PickerObjectSelector];  
                NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
                [invocation setTarget:PickerObjectDelegate];
                [invocation setSelector:PickerObjectSelector];
                [invocation setArgument:&object atIndex:2];
                [invocation retainArguments];
                [invocation invoke];
            }
        }

    Esta es la forma de hacer la Barra de herramientas. Básicamente yo uso el mismo concepto con un ViewController subclase, y yo no uso el empuje estándar vista o modal opciones de visualización. (el ejemplo aquí en realidad coloca un cuadro de texto y una barra de herramientas en la parte superior del teclado.

    @interfaz BugEditCommentController : UIViewController {
    UITextView* Comentario;
    UIToolbar* Barra De Herramientas;
    }
    -(void) addToViewWithAnimation:(UIView*) theView;

    Para activar esta vista usualmente llamada [objeto becomeFirstResponder];
    así que si usted agrega a su Controlador de vista del constructor, todo lo que necesita hacer es llamar a [objeto becomeFirstResponder];

     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
         [nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil];
         [nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil];

    abd el caso de implementar este método en el controlador (que se define en el código de arriba)

    -(void) keyboardWillShow:(NSNotification *) note
    {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.3];
    
        CGRect toolbarFrame  = Toolbar.frame;
        CGRect keyboardFrame;
        CGPoint keyboardCenter;
        [[note.userInfo valueForKey:UIKeyboardCenterEndUserInfoKey] getValue:&keyboardCenter];
        [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &keyboardFrame];
    
        //CGRect toolbarRect = Toolbar.center;
        toolbarFrame.origin.y= keyboardCenter.y - ((keyboardFrame.size.height/2) + (toolbarFrame.size.height));
        Toolbar.frame = toolbarFrame;
        [UIView commitAnimations];
    
    }
    
    -(void) keyboardWillHide:(id) object
    {
    
    //you could call [self removeFromSuperviewHere];
    }
    
    -(void) removeFromsuperViewWithAnimation
    {
        [Comment resignFirstResponder];
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.3];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDidStopSelector:@selector(AnimationDidStop:)];
    
        CGRect frame = Toolbar.frame;
        frame.origin.y = 480;
        Toolbar.frame = frame;
    
        [self.view viewWithTag:1].alpha = 0;  //fade transparent black background to clear.
        [UIView commitAnimations];
    
    }
    -(void)AnimationDidStop:(id) object
    {
        [self.view removeFromSuperview];
    }

    espero que la información adicional de ayuda.

    Gracias. Pero el UITextView falta. No estoy seguro de cómo integrar a los que con el ‘firstResponder’ mecanismo.
    Lo siento, sí, que el ejemplo es sólo la UIPickerView. Voy a publicar el código para el UITextView, cuando tengo la oportunidad.
    Podría publicar su código en github?

    OriginalEl autor Bluephlame

  2. 0

    Estoy buscando la solución para este problema.

    Me pareció que esta era la mejor solución, puede utilizar este SCKit para agregar la barra de herramientas para despedir el UIPickerView o la UIDatePicker como usted desea.

    Siguiente es github enlace: https://github.com/scelis/SCKit/tree/

    Divertirse!

    OriginalEl autor Jiejing Zhang

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea