1

我以编程方式将 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 时,如果我不包括导航栏的偏移量,它就会偏离底部 44...

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

干杯,加文

4

3 回答 3

1

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

于 2013-02-06T13:08:55.327 回答
1

在对此进行了更多研究之后,我意识到我最初的问题是有缺陷的。目前尚不清楚我将 UIDatePicker 添加为子视图的位置。我已经更新了这个问题。

我现在有两个答案:

1) 在 ViewDidLoad 中定位并添加 UIDatePicker。使用 Autoresizing 来处理视图大小的变化。然后使其可见以响应用户点击控件:

- (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;
    }
}

谢谢,加文

于 2013-02-07T13:05:03.580 回答
0
  1. 对于UIDatePicker,您无需指定其大小。因为大多数时候你会希望它和屏幕一样宽并且它的高度是固定的。但是你仍然需要把它放在正确的位置。也就是说,您需要为它计算正确的位置,设置它的框架。

  2. 因为大多数时候你不希望你UIDatePickernavBar. 所以苹果会让addSubview工作就好像界限“更小”一样。

于 2013-02-06T09:40:01.383 回答