我希望实现 iPhone 通讯录应用程序中的生日日期设置器的相同效果。如何让一个模态日期选择器只显示在屏幕上半部分。
我希望日期选择器位于 UITableView 上方(就像 iPhone 通讯录应用程序中一样)。我希望UITableView在日期选择器后面自由滚动(就像 iPhone 通讯录应用程序中一样)。
提前感谢您。
我希望实现 iPhone 通讯录应用程序中的生日日期设置器的相同效果。如何让一个模态日期选择器只显示在屏幕上半部分。
我希望日期选择器位于 UITableView 上方(就像 iPhone 通讯录应用程序中一样)。我希望UITableView在日期选择器后面自由滚动(就像 iPhone 通讯录应用程序中一样)。
提前感谢您。
迄今为止,实现日期选择器/滚轮选择器键盘的最佳方法是使用文本字段的 输入视图属性:
构建一个包含UITextField的简单自定义UITableViewCell(只有因为问题是关于将其嵌入表视图中)。
@interface pickerCell : UITableViewCell
{
UITextField *txtTextField;
UIPickerView* dtpPicker;
}
将TextField的inputView设置为UIPickerView(确保它们都已分配和初始化):
txtTextField.inputView = dtpPicker;
你快要完成了。现在,当文本框成为第一响应者(用户点击它)时,用户将会看到一个选择器视图。 只需填充自己的值,或使用日期选择器。
您可以将选择器的代理 / 数据源设置为同一单元格(如果它始终是出生日期单元格),或者让单元格的父视图加载它的数据。无论您做出哪种选择,请确保在更新 txtTextField.text 时进行更新。
pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
祝你好运! Elad.
这是我实现它的方式:我在一个名为DateTimeEntryViewController的不同控制器中拥有UIDatePicker,在用户点击按钮/单元格以输入日期和时间时,我在我的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];
这段代码将在UITableView中添加一个日期选择器作为子视图。假设我们是UITableViewController的子类。
我们将从底部动画显示选择器。最后,我们将钩入scrollViewDidScroll:委托方法,以便在表格滚动时,选择器似乎停留在原地。
在.h文件中,添加一个picker属性。
@property (strong, nonatomic) UIDatePicker *datePicker;
- (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);
}
不要忘记在viewDidUnload中使用@synthesize声明你的属性,并释放它。
[UIView animateWithDuration:0.5 animations:^{
[datePicker setFrame:CGRectMake(0, 200, 320, 216)];
}];
虽然这是在一个旧帖子中发表的,但可能会对某些人有所帮助。为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);
}