UITextView e UIPickerView com seu próprio UIToolbar

votos
2

Eu gosto de replicar o comportamento forma de Safari no iPhone no meu próprio aplicativo. Se você inserir dados em um formulário web que você começa um UIToolbar separado (anterior, posterior, feito) um pouco acima do UIKeyboardView. Mesmo para escolher uma opção: você obtém o mesmo UIToolbar logo acima uma UIPickerView.

Eu estou procurando Demos / sourcode / ideias como implementar isso. Será que eu criar o meu próprio subexibição com essa barra de ferramentas e textview / pickerView? Existe uma maneira mais elegante? Especialmente algo que aproveita becomeFirstResponder de UITextField?

Publicado 19/05/2009 em 22:00
fonte usuário
Em outras línguas...                            


2 respostas

votos
13

Então, eu criei uma subclasse UIViewController para gerenciar isso.

em que eu escrevi esta função para adicionar.

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

Eu, então, criado o ponto de vista em IB, aqui é o que minha classe Header parecia no fim de que. (Há também uma UIToolbar na visão eu simplesmente não tenho uma referência a ele em meu Controller)

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

Para, em seguida, ocultar a vista que eu 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];
}

E por último mas não menos importante de todas as funções de delegado para o selecionador.

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

Isto é como você fazer o barra de ferramentas. Basicamente eu usar o mesmo conceito com uma subclasse ViewController, e eu não usar a exibição de impulso padrão ou opções de exibição modais. (O exemplo aqui, na verdade coloca uma caixa de texto e uma barra de ferramentas na parte superior do teclado.

@ interface BugEditCommentController: UIViewController {UITextView * Comentário; UIToolbar * Barra de Ferramentas; } - (void) addToViewWithAnimation: (UIView *) theview;

Para ativar essa visão geralmente você chamaria [objeto becomeFirstResponder]; por isso, se você adicionar isso ao seu construtor vista Controller, tudo que você precisa fazer é chamar [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 se você implementar este método no seu controlador (definido no código acima)

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

Esperamos que a informação adicional ajuda.

Respondeu 19/05/2009 em 23:30
fonte usuário

votos
0

Eu estou procurando a solução para este problema também.

Eu encontrei esta era a melhor solução, você pode usar este SCKit para adicionar barra de ferramentas para fechar a UIPickerView ou o UIDatePicker como você quer.

A seguir é o link github: https://github.com/scelis/SCKit/tree/

Diverta-se!

Respondeu 18/02/2012 em 13:18
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more