繁体   English   中英

iPhone中的UIDatePicker

[英]UIDatePicker in iPhone

我在用UIDatePicker挣扎。 我以为可以像普通的子视图一样将其添加到当前视图中,但是没有出现。 经过一番搜索,我找到了将其放入弹出窗口的文档。 我按照这些说明进行操作,并使其可以在iPad上使用。 但是弹窗在iPhone上不起作用。 我需要做什么才能使其在那里工作? 为什么不能像常规子视图一样简单地添加它?

这是我的iPad代码:

-(void)selectADate: (CGPoint)p
{
    UIViewController* popoverContent = [[UIViewController alloc] init]; //ViewController
    UIView *popoverView = [[UIView alloc] init];   //view
    popoverView.backgroundColor = [UIColor blackColor];
    UIDatePicker *datePicker=[[UIDatePicker alloc]init];//Date picker
    datePicker.frame=CGRectMake(0,44,320, 216);
    datePicker.datePickerMode = UIDatePickerModeDate;
    [datePicker setTag:10];
    datePicker.date = self.displayedDate;
    [datePicker addTarget:self action:@selector(pickerChanged:)     forControlEvents:UIControlEventValueChanged];
    [popoverView addSubview:datePicker];
    popoverContent.view = popoverView;
    UIPopoverController * popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
    //popoverController.delegate=self;
    self.datePopover = popoverController;
    [popoverController setPopoverContentSize:CGSizeMake(320, 264) animated:NO];
    CGRect popoverLocation = CGRectMake(p.x-160, p.y-200, 320, 216);
    [popoverController presentPopoverFromRect:popoverLocation inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];//tempButton.frame where you need you can put that frame//
}

- (void)pickerChanged:(id)sender
{
    self.displayedDate = [sender date];
    [self showMonthContainingDate:[sender date]];
}

我的屏幕当前布局为一种日历页面,显示一个月的时间。 每天的卖出都是一个子视图。 屏幕顶部是标题,其中包含有关年,月等的信息。当用户点击标题时,将显示日期选择器,并且日历页面显示与选择器中选择的日期相对应的所选月份。突出显示日期(该日期的子视图的背景具有不同的颜色)。

我不确定为什么我什至需要弹出窗口,除非只是提供空白视图以将日期选择器放置在日历页面平铺视图的前面。 但是,我不应该能够简单地将其添加为子视图,然后调用BringSubviewToFront:吗? 我试过了,但是在iPad上不起作用,因此我使用了popover。

如果在添加其他子视图时添加它,则可以显示它,但是我希望在点击标题时显示它。 这是我的点击代码:

- (IBAction)tap:(UITapGestureRecognizer *)sender {
   //tap gesture recognizer
   //Assume the user tapped on a day cell.
   for (UIView *dayCell in self.view.subviews) {
      if (CGRectContainsPoint(dayCell.frame, [sender locationInView:self.view])) {
         //found the cell that was touched.
     //NSLog(@"Found a view containing the touch with coords. %@",NSStringFromCGRect(dayCell.frame));
         for (UIView *insideView in dayCell.subviews) {
            for (UILabel *dayElement in insideView.subviews) {
               //found a subview of the day cell.
               if ([dayElement isKindOfClass:[UILabel class]]) {
                  NSLog(@"Found a subview %@",dayElement.text);
               }
            }
         }
      }
      if ([dayCell isKindOfClass:[UILabel class]]) {
         // This is the heading label.
         UILabel * headingLabel = (UILabel *) dayCell;
         if (CGRectContainsPoint(headingLabel.frame, [sender locationInView:self.view])) {
            NSLog(@"The heading was tapped");
            if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
               //iPhone code goes here
               [self iphoneSelectADate:[sender locationInView:self.view]];
            } else  {
               [self selectADate:[sender locationInView:self.view]];
            }
         }
      }
   }
}

这是当前无法使用的iPhone代码:

-(void)iphoneSelectADate: (CGPoint)p
{
   UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height - 216, 320, 216)];
   [datePicker setDate:[NSDate date]];  //This is the default
   [datePicker setHidden:NO];
   [self.view addSubview:datePicker];
}

如果我逐步进入调试器,则会看到此代码已执行,但日期选择器未显示。

UIDatePicker继承自UIView ,因此您可以像UILabel一样添加它。 确保给它一个框架。

这样的事情适用于iPhone屏幕的底部:

datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height - 216, 320, 216)];
[datePicker setDate:[NSDate date]];  //This is the default
[self.view addSubview:datePicker];

听起来您可能遇到了子视图分层问题,而不是UIDatePicker问题。

如果这不起作用,请发布一些代码,我们将帮助您解决问题。

不确定这是否会有所帮助,但是需要使用main_queue来调度已存在视图的UI更改,例如dispatch_async(dispatch_get_main_queue(), ^ { [self.view addSubview:yourSubview]; });

我想我可能已经找到解决问题的关键。 将文档放置在与位置相关的代码的各个位置上之后,我决定使用viewWillLayoutSubviews 我再次通读了文档,并决定尝试将代码放入viewWillAppear ,这似乎已经解决了问题。

使用viewWillAppear的更改还需要实现willAnimateRotationToInterfaceOrientation:duration:

iPad似乎需要viewWIllLayoutSubviews ,iPhone则不需要,因此我也添加了以下内容:

-(void)viewWillLayoutSubviews
{
   if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
      //iPhone code goes here (empty, since calling showMonthContainingDate: doesn't work from here in iPhone
   } else  {
      //ipad code goes here
      NSDate *dayToDisplay = self.displayedDate;
      [self showMonthContainingDate:dayToDisplay];
      //iPad uses wrong dimensions unless the routine is called from here.
   }
}

最后一点。 在一种情况下,设备的方向设置不正确-在启动时在iPhone上处于横向状态。 根据对另一个问题回答,除非iPhone是仅横向应用,否则它始终以纵向启动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM