如何动态定位iPhone的UIDatePicker控件

时间:2013-02-06 09:05:21

标签: ios uidatepicker

我是以编程方式将UIDatePicker控件添加到视图中。我希望DatePicker以标准方式显示停靠在屏幕底部......

我正在为DatePicker设置框架,需要了解3.5英寸iPhone和4英寸iPhone的不同屏幕尺寸。

以下代码产生了预期的结果,但我有几个问题......

// In ViewDidLoad
CGRect defaultFrame = CGRectMake(0,0,0,0);
_datePicker = [[UIDatePicker alloc] initWithFrame:defaultFrame];

CGRect bounds = [self.view bounds];
int datePickerHeight = _datePicker.bounds.size.height;
int navBarHeight = 44;
CGRect datePickerFrame = CGRectMake(0, bounds.size.height - (datePickerHeight + navBarHeight), 0, 0);
[_datePicker setFrame:datePickerFrame];

// In method responding to user tap
[self.view addSubview:_datePicker];

Q1。有没有更优雅的方式来做到这一点?除了以外的东西,用框架创建DatePicker,检查它的高度,然后设置它的框架......

Q2。视图是一个UITableView,位于UINavigationController中。当我获得self.view的边界时,大小包括整个视图,包括导航栏的44。然而,当我添加带有addSubview的DatePicker时,如果我没有包含navBar的偏移量,那么它会在44以下的底部...

为什么当[self.view bounds]返回完整边界时,addSubview在较小的范围内工作?

干杯, 加文

3 个答案:

答案 0 :(得分:1)

问题是导航栏在视图加载初始化后向下推动所有视图。 自动调整掩码可能有所帮助。

答案 1 :(得分:1)

在进一步研究之后,我意识到我原来的问题是有缺陷的。目前尚不清楚我在哪里添加UIDatePicker作为子视图。我已经更新了这个问题。

我现在有两个答案:

1)在ViewDidLoad中定位并添加UIDatePicker。使用“自动调整大小”来处理视图大小更改。然后在用户点击控件时使其可见:

- (void)viewDidLoad
{
    [super viewDidLoad];
    _tableView = (UITableView*)self.view;
    _tableView.backgroundColor = [UIColor colorWithRed:0.941 green:0.941 blue:0.913 alpha:1.000];
    _tableView.backgroundView = nil;

    _datePicker = [[UIDatePicker alloc] init];

    CGRect bounds = [self.view bounds];
    int datePickerHeight = _datePicker.frame.size.height;
    _datePicker.frame = CGRectMake(0, bounds.size.height - (datePickerHeight), _datePicker.frame.size.width, _datePicker.frame.size.height);
    _datePicker.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;

    _datePicker.isHidden = YES;
    [self.view addSubview:_datePicker];

    [_datePicker addTarget:self action:@selector(datePickerChanged:) forControlEvents:UIControlEventValueChanged];
}

2)只需根据需要设置UIDatePicker的帧,而不是在ViewDidLoad中设置:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    switch (indexPath.row) {
        case RowDate:
        {
            CGRect bounds = [self.view bounds];
            int datePickerHeight = _datePicker.frame.size.height;
            _datePicker.frame = CGRectMake(0, bounds.size.height - (datePickerHeight), _datePicker.frame.size.width, _datePicker.frame.size.height);
            [self.view addSubview:_datePicker];
            break;
        }

        default:
            break;
    }
}

谢谢, 加文

答案 2 :(得分:0)

  1. 对于UIDatePicker,您无需指定其大小。因为大多数时候你会希望它像屏幕一样宽,并且它的高度是固定的。但是你还需要把它放在正确的位置。也就是说,你需要为它计算正确的位置,设置它的框架。

  2. 因为大多数时候您不希望UIDatePickernavBar重叠。因此,Apple会让addSubview工作,好像边界“更小”。