我希望与iPhone通讯录应用中的生日日期设定器具有相同的效果。如何才能在屏幕中间显示模态日期选择器。
我希望日期选择器超过UITableView(就像在iphone联系人应用程序中一样)。我希望UITableView能够在日期选择器后面自由滚动(就像在iphone联系人应用程序中一样)。
提前致谢。
答案 0 :(得分:48)
到目前为止,实现日期选择器/ uipicker键盘的最佳方法是使用文本字段的输入视图属性:
构建一个包含UITextField的简单自定义UITableViewCell(这很重要,因为问题是关于在表视图中嵌入一个)
@interface pickerCell : UITableViewCell
{
UITextField *txtTextField;
UIPickerView* dtpPicker;
}
将TextField的inputview设置为UIPickerView (确保它们已经先分配并初始化):
txtTextField.inputView = dtpPicker;
你差不多完成了。现在,当文本字段成为第一个响应者(用户点击它)时,将向用户呈现选择器视图。 只需填写您自己的价值观即可。或使用日期选择器。
您可以将选择器的委托/数据源设置为相同的单元格(如果它始终是生日数据单元格),或者让单元格的超级视图加载数据。无论您做出何种选择,请务必更新
上的txtTextField.textpickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
答案 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联系人应用程序中,按下按钮时会出现日期选择器。要做到这一点,你需要做一些事情:
连接到某个动作的按钮,让我们调用动作
-(IBAction)showDatePicker:(id)sender
作为你的datePicker的iVar,我们称之为datePicker
。
现在,在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);
}