2009-05-19 45 views
2

我喜欢在我自己的应用程序中复制iPhone上的Safari的表单行为。如果您在Web表单中输入数据,则会在UIKeyboardView上方获得单独的UIToolbar(上一个,下一个,完成)。选择一个选项也是一样的:在UIPickerView上方获得相同的UIToolbar。UITextView和UIPickerView有自己的UIToolbar

我正在寻找演示/ sourcode /想法如何实现这一点。我会用该工具栏和textview/pickerview创建我自己的子视图吗?有没有更优雅的方式?特别是利用UITextfield的FirstResponder的东西?

回答

13

所以我创建了一个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]; 
     } 
    } 

这就是你如何做ToolBar。基本上我使用与ViewController子类相同的概念,我不使用标准的推视图或模式显示选项。 (这里的例子实际上放置一个文本框,并在键盘的顶部的工具栏

@interface BugEditCommentController:{的UIViewController 的UITextView *评论; UIToolbar *工具栏; } - (无效)addToViewWithAnimation:(UIView的*) theView;

来激活此视图通常你会打电话[对象becomeFirstResponder]; 因此,如果您添加到您的视图控制器的构造函数,所有你需要做的就是调用[对象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如果您实现您的控制器上这种方法(在上面的代码中定义)

-(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

谢谢。但是UITextView丢失了。我不知道如何将其与'firstResponder'机制整合。 – luebken 2009-05-20 07:52:38

0

我正在寻找这个问题的解决方案。

我发现这是最好的解决方案,你可以使用这个SCKit来添加工具栏来关闭UIPickerView或者UIDatePicker。

以下是GitHub的链接:https://github.com/scelis/SCKit/tree/

玩得开心!