【问题标题】:ToolBar at the top of UIPIckerView in xcode?xcode中UIPIckerView顶部的工具栏?
【发布时间】:2012-12-04 10:15:26
【问题描述】:

我需要在UIPickerView 的顶部添加一个带有完成按钮的toolbar。我不想使用actionSheet,因为我希望视图的其余部分处于活动状态。我已经使用了以下代码:

- (BOOL)textFieldDidBeginEditing:(UITextField *)textField {
  [txtstate resignFirstResponder];
  pickerView = [[UIPickerView alloc]init] ;
  pickerView.frame=CGRectMake(10, 75, 180,20);
  pickerView.delegate = self;
  pickerView.showsSelectionIndicator = YES;

  UIToolbar* toolbar = [[UIToolbar alloc] init];
  toolbar.frame=CGRectMake(0,75,180,10);
  toolbar.barStyle = UIBarStyleBlackTranslucent;
  UIBarButtonItem *flexibleSpaceLeft = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];


  UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                       style:UIBarButtonItemStyleDone target:self
                                                                      action:@selector(doneClicked:)];


   [toolbar setItems:[NSArray arrayWithObjects:flexibleSpaceLeft, doneButton, nil]];

   textField.inputAccessoryView = toolbar;
   [pickerView addSubview:toolbar];
   [self.view addSubview:pickerView];
}

通过使用上面的代码,我的工具栏被添加了,但它隐藏在UIPickerView 下,并且被添加到了中间。如何使工具栏出现在最前面(在UIPickerView 的顶部)?

【问题讨论】:

  • 创建一个 UIView,UIView 的框架应该是 UIPickerView 的高加上工具栏的高,将 UiPIckerView 和工具栏添加为子视图,并将视图添加到自己的视图中。查看。
  • @GiuseppeiPichy 你能告诉我怎么做吗?/
  • 检查我更新的答案

标签: iphone xcode uipickerview uitoolbar


【解决方案1】:

有一个更简单的方法 您可以将选择器插入为文本字段的 inputView 并将工具栏作为 inputAccessoryView 添加到您的 textField 喜欢:

textField.inputView = pickerView;
textField.inputAccessoryView = toolBar;

【讨论】:

  • 你成就了我的一天!谢谢。
  • 2019年9月,这仍然是最简单最有效的解决方案,谢谢!
【解决方案2】:

你可以用这个来getPicker

-(void)getValuePicker
{
    ViewForValuePicker = [[UIView alloc]initWithFrame:CGRectMake(0, 219, 320, 266)];

    UIToolbar *toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)];
    toolBar.barStyle = UIBarStyleBlackOpaque;

    UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneBtnPressToGetValue)];

    [toolBar setItems:[NSArray arrayWithObject:btn]];
    [ViewForValuePicker addSubview:toolBar];


    valuePicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 44, 320, 216)];
    valuePicker.delegate=self;
    valuePicker.dataSource=self;
    valuePicker.showsSelectionIndicator=YES;

    [ViewForValuePicker addSubview:valuePicker];

    [appDelegate.window addSubview:ViewForValuePicker];
} 

及其委托方法

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
{
    return [pickerValueAry count];
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
{
    NSMutableArray *ary = [[NSMutableArray alloc] initWithArray:pickerValueAry];
    id str=[ary objectAtIndex:row];
    return str;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{    
    NSLog(@"selectedRowInPicker >> %d",row);
}  

你可以关注我的回答了解更多Link

【讨论】:

  • @zeevblu 的方法要简单得多。我建议这样做。请注意,如果您使用的是键盘,请务必切换硬件键盘cmd-k
【解决方案3】:

viewDidLoad 中只需添加此代码,当 textFieldBegin 像下面这样更改框架...

首先在.h 文件中为日期选择器的后视图创建​​全局 UIView,如下所示..

UIView *viewPicker;
UIPickerView * pickerView;

然后像下面这样使用它..

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    viewPicker.frame = CGRectMake(0, 112, 320, viewPicker.frame.size.height);  
    [UIView commitAnimations];
    return YES;
}

添加下面的代码...

    viewPicker = [[UIView alloc]initWithFrame:CGRectMake(0, 480, 320, 258)];
    UIToolbar* toolbar = [[UIToolbar alloc] init];
    toolbar.frame=CGRectMake(0,0,320,44);
    toolbar.barStyle = UIBarStyleBlackTranslucent;
    UIBarButtonItem *flexibleSpaceLeft = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];


    UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                   style:UIBarButtonItemStyleDone target:self
                                                                  action:@selector(doneClicked:)];


    [toolbar setItems:[NSArray arrayWithObjects:flexibleSpaceLeft, doneButton, nil]];
    pickerView = [[UIPickerView alloc]init] ;
    pickerView.frame=CGRectMake(0, 44, 320,216);
    pickerView.delegate = self;
    pickerView.showsSelectionIndicator = YES;

    [viewPicker addSubview:pickerView];
    [viewPicker addSubview:toolbar];
    [self.view addSubview:viewPicker];

并在完成按钮中单击只是再次设置这样的框架..

-(IBAction)doneClicked:(id)sender
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    viewPicker.frame = CGRectMake(0, 370, 320, 258);
    [UIView commitAnimations];
}

希望对你有帮助……

【讨论】:

  • 我必须通过 addsubview 将工具栏添加到我的选择器视图中。谢谢你的建议。仅仅做 inputAccessoryView 是不够的。我禁用了我的 textInput,只显示了选择器。
【解决方案4】:

你可以试试这段代码:

- (BOOL)textFieldDidBeginEditing:(UITextField *)textField {
    [textField resignFirstResponder];

    UIView *view = [[UIView alloc]initWithFrame:CGRectMake(20, 100, 180, 260)];

    pickerView = [[UIPickerView alloc]init] ;
    pickerView.frame=CGRectMake(0, 44, 180,216);
    pickerView.delegate = self;
    pickerView.showsSelectionIndicator = YES;

    UIToolbar* toolbar = [[UIToolbar alloc] init];
    toolbar.frame=CGRectMake(0,0,180,44);
    toolbar.barStyle = UIBarStyleBlackTranslucent;
    UIBarButtonItem *flexibleSpaceLeft = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];


    UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                   style:UIBarButtonItemStyleDone target:self
                                                                  action:@selector(doneClicked:)];


    [toolbar setItems:[NSArray arrayWithObjects:flexibleSpaceLeft, doneButton, nil]];

    textField.inputAccessoryView = toolbar;

    [view addSubview:toolbar];
    [view addSubview:pickerView];
    [self.view addSubview:view];

    return YES;
}

【讨论】:

    【解决方案5】:

    好的...在故事板编辑器上创建一个垂直堆栈视图,在上面添加工具栏和下面的选择器视图怎么样?它们不必真正相互关联,只需要同时显示和隐藏即可。有点像下面这样:

    这真的很容易做到,你不必做编码魔术。

    是的,我知道这个问题已有 7 年历史了,但仍有人在寻找这个问题的解决方案。

    【讨论】:

    • 如果您需要一个非常自定义的 toolbar-esque 视图在您的选择器顶部,这是一个有效的解决方案。但是,如果不是这种情况,那么您应该始终选择 inputAccessoryView 和本机 UIToolbar,以便免费获得系统级 UI 更改/更新。
    【解决方案6】:

    你可以这样设置你的 UIPickerView:-

    -(void)showPicker{
    
    
        menu = [[UIActionSheet alloc] initWithTitle:@"Select Time"
                                           delegate:self
                                  cancelButtonTitle:nil
                             destructiveButtonTitle:nil
                                  otherButtonTitles:nil];
    
        pickerView=[[UIPickerView alloc] init];
        pickerView.frame= CGRectMake(0.0, 44.0, 0.0, 0.0);
        pickerView.delegate=self;
        pickerView.dataSource=self;
        pickerView.showsSelectionIndicator = YES;
        txtopsbox.inputView=pickerView; 
    
        dateTool = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
        dateTool.barStyle=UIBarStyleBlackOpaque;
        [dateTool sizeToFit]; 
        NSMutableArray *barItems = [[NSMutableArray alloc] init];
        UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(DatePickerDoneClick)];
        [barItems addObject:flexSpace];
    
        UIBarButtonItem *cancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelClicked:)];
    
        [barItems addObject:cancel];
    
    
        [dateTool setItems:barItems animated:YES];
        [menu addSubview:dateTool];
        [menu addSubview:pickerView];
        [menu showInView:self.view];
        [menu setBounds:CGRectMake(0,0,320, 464)];
        [pickerView release];
    
        }
    

    更新

    你也可以像另一种方式一样:-

    - (IBAction)showPicker
        {
            if(pickerVisible == NO)
            {
                // create the picker and add it to the view
                if(self.datePicker == nil) self.datePicker = [[[UIDatePicker alloc] initWithFrame:CGRectMake(0, 460, 320, 216)] autorelease];
                [self.datePicker setMaximumDate:[NSDate date]];
                [self.datePicker setDatePickerMode:UIDatePickerModeDate];
                [self.datePicker setHidden:NO];
                [self.view addSubview:datePicker];
    
                // the UIToolbar is referenced 'using self.datePickerToolbar'
                [UIView beginAnimations:@"showDatepicker" context:nil];
                // animate for 0.3 secs.
                [UIView setAnimationDuration:0.3];
    
                CGRect datepickerToolbarFrame = self.datePickerToolbar.frame;
                datepickerToolbarFrame.origin.y -= (self.datePicker.frame.size.height + self.datePickerToolbar.frame.size.height);
                self.datePickerToolbar.frame = datepickerToolbarFrame;
    
                CGRect datepickerFrame = self.datePicker.frame;
                datepickerFrame.origin.y -= (self.datePicker.frame.size.height + self.datePickerToolbar.frame.size.height);
                self.datePicker.frame = datepickerFrame;
    
                [UIView commitAnimations];
                pickerVisible = YES;
            }
        }
    
        - (IBAction)done
        {
            if(pickerVisible == YES)
            {
                [UIView beginAnimations:@"hideDatepicker" context:nil];
                [UIView setAnimationDuration:0.3];
    
                CGRect datepickerToolbarFrame = self.datePickerToolbar.frame;
                datepickerToolbarFrame.origin.y += (self.datePicker.frame.size.height + self.datePickerToolbar.frame.size.height);
                self.datePickerToolbar.frame = datepickerToolbarFrame;
    
                CGRect datepickerFrame = self.datePicker.frame;
                datepickerFrame.origin.y += (self.datePicker.frame.size.height + self.datePickerToolbar.frame.size.height);
                self.datePicker.frame = datepickerFrame;
                [UIView commitAnimations];
    
                // remove the picker after the animation is finished
                [self.datePicker performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.3];
            }
        }
    

    【讨论】:

    • 但我不想使用 actionsheet。我需要使整个视图处于活动状态。所以我没有使用 actionsheet
    • 这可能是一个很好的答案,但答案的作者没有阅读问题,帖子的作者问:我不想使用操作表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2012-02-18
    相关资源
    最近更新 更多