0

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

私の画面は現在、1 か月の日付を示す一種のカレンダー ページとしてレイアウトされています。毎日の販売はサブビューです。画面の上部には、年、月などの情報を含むヘッダーがあります。ユーザーがヘッダーをタップすると、日付ピッカーが表示され、ピッカーで選択された日付に対応する選択された月がカレンダー ページに表示されます。その日が強調表示されます (その日のサブビューの背景は別の色になります)。

カレンダー ページのタイル ビューの前にある日付ピッカーを配置する空白のビューを提供するだけでない限り、なぜポップオーバーが必要なのかわかりません。しかし、それを単にサブビューとして追加してから、bringSubviewToFront: を呼び出すことはできませんか? 私はそれを試しましたが、iPadでは機能しなかったため、ポップオーバーを使用しました。

他のサブビューを追加するときに追加すれば表示できるのですが、見出しをタップしたときに表示させたいです。これが私のタップコードです:

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

デバッガーをステップ実行すると、このコードが実行されていることがわかりますが、日付ピッカーは表示されません。

4

3 に答える 3

1

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

それでも問題が解決しない場合は、コードの一部を投稿してください。解決をお手伝いします。

于 2013-01-09T00:01:34.580 に答える
0

私は自分の問題の鍵を見つけたかもしれないと思います。オリエンテーション関連のコードを配置するためのさまざまな場所についてこのドキュメントを読んだ後、私はに決めました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.
   }
}

最後に1つ。デバイスの向きが正しく設定されていないシナリオが1つあります。それは、起動時のiPhoneの横向きです。別の質問に対するこの回答によると、iPhoneは、横向きのみのアプリでない限り、常に縦向きで起動します。

于 2013-01-10T02:45:54.650 に答える
0

これが役立つかどうかはわかりませんが、既に存在するビューの UI の変更は、main_queue を使用してディスパッチする必要があります。 dispatch_async(dispatch_get_main_queue(), ^ { [self.view addSubview:yourSubview]; });

于 2013-01-09T01:09:59.203 に答える