如何制作仅覆盖屏幕一半的模态日期选择器?

时间:2011-12-13 03:58:34

标签: iphone uiviewcontroller modalviewcontroller uidatepicker

我希望与iPhone通讯录应用中的生日日期设定器具有相同的效果。如何才能在屏幕中间显示模态日期选择器。

我希望日期选择器超过UITableView(就像在iphone联系人应用程序中一样)。我希望UITableView能够在日期选择器后面自由滚动(就像在iphone联系人应用程序中一样)。

提前致谢。

5 个答案:

答案 0 :(得分:48)

到目前为止,实现日期选择器/ uipicker键盘的最佳方法是使用文本字段的输入视图属性:

  1. 构建一个包含UITextField的简单自定义UITableViewCell(这很重要,因为问题是关于在表视图中嵌入一个)

    @interface pickerCell : UITableViewCell
    {
        UITextField *txtTextField;
        UIPickerView* dtpPicker;
    }
    
  2. 将TextField的inputview设置为UIPickerView (确保它们已经先分配并初始化):

    txtTextField.inputView = dtpPicker;
    
  3. 你差不多完成了。现在,当文本字段成为第一个响应者(用户点击它)时,将向用户呈现选择器视图。 只需填写您自己的价值观即可。或使用日期选择器。

  4. 您可以将选择器的委托/数据源设置为相同的单元格(如果它始终是生日数据单元格),或者让单元格的超级视图加载数据。无论您做出何种选择,请务必更新

    上的txtTextField.text
    pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    
  5. 祝你好运! ELAD。

答案 1 :(得分:2)

此代码将添加日期选择器作为UITableView的子视图。这段代码假设我们是UITableViewController的子类。

我们要从底部为拾取器制作动画。最后,我们将挂钩到scrollViewDidScroll:delegate方法,以便在表格滚动时,选择器似乎保持不变。

在.h文件中,为选择器添加属性。

@property (strong, nonatomic) UIDatePicker *datePicker;

在.m文件中,我们添加了日期选择器。

- (void)viewDidLoad
{
  // Your own customization code.

    self.datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 200, 320, 216)];
    self.datePicker.hidden = YES;
    [self.datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:self.datePicker];
}

- (void)presentDatePicker
{
    if (self.datePicker.hidden == NO) { return; }

    // Set the date picker frame to be below the screen.
    self.datePicker.frame = CGRectMake(0, self.view.frame.size.height, self.datePicker.size.width, self.datePicker.size.height);
    CGRect originFrame = self.datePicker.frame;

    // Animate from the bottom.
    [UIAnimation animateWithDuration:.3 animations^{
      self.datePicker.frame = CGRectMake(0, 200, originFrame.size.width, originFrame.size.height);
    }];
}

#pragma mark - Scroll view delegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGRect tableBounds = self.tableView.bounds;
    CGRect datePickerFrame = self.datePicker.frame;

    self.datePicker.frame = CGRectMake(0, 200 + tableBounds.origin.y, datePickerFrame.size.width, datePickerFrame.size.height);
}

不要忘记@synthesize您的属性并在viewDidUnload

上释放它

答案 2 :(得分:1)

在iPhone联系人应用程序中,按下按钮时会出现日期选择器。要做到这一点,你需要做一些事情:

  1. 连接到某个动作的按钮,让我们调用动作
    -(IBAction)showDatePicker:(id)sender

  2. 作为你的datePicker的iVar,我们称之为datePicker

  3. 现在,在ViewDidLoad中,您必须创建datePicker并设置其框架。因为我们不希望它在按下showDatePicker按钮之前显示,所以设置它的框架使其不在屏幕上。 (0,416,320,216)应该是好的。现在添加datePicker作为vc视图的子视图。请记住,它不应该出现,因为我们将帧设置为离开屏幕。现在,在showDatePicker操作中,我们想要显示datePicker,因此我们可以通过更改基于块的动画中的帧来为其设置动画:

    [UIView animateWithDuration:0.5 animations:^{
        [datePicker setFrame:CGRectMake(0, 200, 320, 216)];
    }];
    

    同样,如果你想创建一个使datePicker消失的按钮,你可以这样做。您只需将框架设置回原来的状态即可。

    我希望这有帮助!

    -K

答案 3 :(得分:1)

这就是我实现它的方法:我将UIDatePicker放在一个名为DateTimeEntryViewController的不同控制器中,当用户单击按钮/单元格以引入日期和时间时,我在我的UIViewController中执行以下代码:

self.alphaView = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.alphaView.opaque = NO;
self.alphaView.backgroundColor = [UIColor clearColor];
self.dateTimeEntryViewController.view.backgroundColor = [UIColor clearColor];

UIWindow *window = [[TTNavigator navigator] window];
[window addSubview:self.alphaView];
[window insertSubview:self.dateTimeEntryViewController.view aboveSubview:self.alphaView];

CGRect r = [_dateTimeEntryViewController.view frame];
r.origin.y = 480.0f;
[self.dateTimeEntryViewController.view setFrame:r]; 

[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:0.5f];
self.alphaView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5f];
r.origin.y = 0;
[self.dateTimeEntryViewController.view setFrame:r];
[UIView commitAnimations];

因此我基本上显示的视图控制器在当前的视图控制器上面有UIDatePicker。

答案 4 :(得分:1)

在旧帖子中发帖,但可能对某人有所帮助。对于3.5英寸屏幕,添加200就足够了,对于通用方法,请使用

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
   CGRect tableBounds = self.tableView.bounds;
   CGRect datePickerFrame = self.datePicker.frame;
   self.datePicker.frame = CGRectMake(0,
                                      tableBounds.origin.y + tableBounds.size.height - datePickerFrame.size.height,
                                      datePickerFrame.size.width,
                                      datePickerFrame.size.height);
}