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];
}
デバッガーをステップ実行すると、このコードが実行されていることがわかりますが、日付ピッカーは表示されません。