UITextView и UIPickerView с собственной UIToolbar - PullRequest
2 голосов
/ 20 мая 2009

Мне нравится копировать поведение формы Safari на iPhone в моем собственном приложении. Если вы вводите данные в веб-форму, вы получаете отдельную панель UIToolbar (предыдущий, следующий, готовый) чуть выше UIKeyboardView. То же самое для выбора опции: вы получаете ту же панель UIToolbar чуть выше UIPickerView.

Я ищу демки / sourcode / идеи, как это реализовать. Буду ли я создавать свое собственное подпредставление с этой панелью инструментов и textview / pickerview? Есть ли более элегантный способ? Особенно то, что рычаги становятся первым респондентом UITextfield?

Ответы [ 2 ]

13 голосов
/ 20 мая 2009

Итак, я создал подкласс UIViewCOntroller для управления этим.

о том, что я написал эту функцию, чтобы добавить.

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

Затем я создал представление в IB, вот как выглядел заголовок моего класса в конце этого. (на панели также есть панель инструментов UItoolbar, у меня просто нет ссылки на нее в моем контроллере)

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

Чтобы затем скрыть представление, которое я использую.

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

И последнее, но не менее важное: все функции делегата для средства выбора.

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

Вот как вы делаете панель инструментов. В основном я использую ту же концепцию с подклассом ViewController, и я не использую стандартные параметры push-представления или модального отображения. (Пример здесь фактически помещает Textbox и панель инструментов сверху клавиатуры.

@ interface BugEditCommentController: UIViewController { UITextView * Комментарий; UIToolbar * Панель инструментов; } - (void) addToViewWithAnimation: (UIView *) theView;

Чтобы активировать это представление, вы обычно вызываете [object intoFirstResponder]; поэтому, если вы добавите это в ваш конструктор Controller, все, что вам нужно сделать, это вызвать [object intoFirstResponder];

 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, если вы реализуете этот метод на вашем контроллере (определенный в приведенном выше коде)

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

надеюсь, что дополнительная информация поможет.

0 голосов
/ 18 февраля 2012

Я тоже ищу решение этой проблемы.

Я обнаружил, что это лучшее решение, вы можете использовать этот SCKit, чтобы добавить панель инструментов для отклонения UIPickerView или UIDatePicker, как вы хотите.

Ниже приводится ссылка на github: https://github.com/scelis/SCKit/tree/

Веселись!

...