はい、そうです。必要な時点で pOpOver コントローラーを遅延してロードします。そのビューをサブビューとして追加します (追加をアニメーション化できます)。フレームサイズを必要なサイズにし、pOpOverコントローラーの背景サブビューとして表示した画像を、ポップアップに必要な他のコントロールとともに追加します。
幸運を
アップデート:
よし、ii は私のアプリLucid Reality Check (展開ターゲット iOS4.3) でこれを行う方法を示します。
UIPopoverController を使用して、別のコントローラー ビューを表示できます。ii が最初に行うことは、ii がデバイスの現在の向きを常に認識していることを確認することです。これにより、ii は回転時にポップアップを再配置できます (これは iOS6 で単独で動作するのでしょうか?)。したがって、私のベースコントローラー(ポップアップを表示したい場所から)には、次のようなインスタンス変数があります。
UIInterfaceOrientation toOrientation;
また:
UIPopoverController *popover;
UIButton *popover_from_button;
BOOL representPopover;
popoverはすべてのポップアップで再利用され、popover_from_buttonはポップアップが開始されるボタンを保持します。
次に、次のコードがベース コントローラーに入ります。
- (void)popoverWillRotate {
if ([popover isPopoverVisible]) {
[self dismissPopover];
representPopover = YES;
}
}
- (void)popoverDidRotate {
if (popover && representPopover) {
representPopover = NO;
[self representPopover];
}
}
これら 2 つのメソッドは、次のように、デバイスが回転するたびに呼び出す必要があります。
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
//DLOG(@"willRotateTo %i", toInterfaceOrientation);
toOrientation = toInterfaceOrientation;
if ([Kriya isPad ]) {
[self popoverWillRotate];
}
}
ご覧のとおり、最初に方向がキャプチャされ、次にpopoverWillRotateが呼び出されます。これにより、向きのアニメーション中にポップオーバーが非表示になります。回転後、ポップオーバーを次のように再表示する必要があります。
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
//DLOG(@"didRotateFrom %i", fromInterfaceOrientation);
//[self layout:toOrientation]; //do some layout if You need
if ([Kriya isPad]) {
[self popoverDidRotate];
}
}
- (void)layout:(UIInterfaceOrientation)toInterfaceOrientation {
//one can do view layout here, and call other controllers to do their layout too
}
向きの変更が完了したので、ポップオーバーを表示するためのコードは次のようになります。
#pragma mark Popovers
- (void)presentPopoverWith:(id)controller fromButton:(UIButton*)button {
if (popover)
[popover release];
if (popover_from_button)
[popover_from_button release];
popover_from_button = [button retain];
popover = [[UIPopoverController alloc] initWithContentViewController:controller];
[popover setDelegate:self];
[self representPopover];
}
- (void)representPopover{
if (popover) {
UIPopoverArrowDirection arrowDirection = UIPopoverArrowDirectionAny;
UIViewController *vc = (UIViewController*)[popover contentViewController];
CGSize contentSize = [vc contentSizeForViewInPopover];
if (contentSize.width > 0 && contentSize.height > 0) {
[popover setPopoverContentSize:contentSize animated:NO];
}
//DLOG(@"representPopover rect:%@", [Kriya printRect:popover_from_button.frame]);
[popover presentPopoverFromRect:CGRectOffset(popover_from_button.frame, 0, popover_from_button.frame.size.height + 7.0) inView:self.view permittedArrowDirections:arrowDirection animated:YES];
}
}
- (void)dismissPopover {
if (popover) {
[popover dismissPopoverAnimated:YES];
}
}
最後に、ポップオーバーが閉じられたときに通知を受け取りたい場合は、ベース コントローラーにデリゲート メソッドを実装する必要があります。
#pragma mark UIPopoverControllerDelegate
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
//do something important here like drink some water
}
ベースコントローラーをヘッダーで UIPopoverControllerDelegate にすることを忘れないでください。
ポップアップを行うこの方法の使用例は、次のようになります。
- (void)takeImage {
UIImagePickerController *picker = [[[UIImagePickerController alloc] init] autorelease];
[picker setDelegate:self];
[picker setAllowsEditing:NO];
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
[picker setSourceType:UIImagePickerControllerSourceTypeCamera];
if ([Kriya isPad]) {
[self presentPopoverWith:picker fromButton:backgroundImageButton];
} else {
//modals on iPhone/iPod
//DLOG(@"takeImage addSubview picker");
[self presentModalViewController:picker animated:YES];
}
} else {
//DLOG(@"no camera");
}
}
これは、ポップアップのコンテンツとして画像ピッカーを使用しますが、有効なビューを持つ任意のコントローラーを使用できます。これを行うだけです:
[self presentPopoverWith:popupsContentController fromButton:tappedButton];
不足している情報があってはなりません:)、方法[Kriya isPad]
は次のとおりです。
+ (BOOL)isPad {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200
// iPad capable OS
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
//this is an iPad
return YES;
}else {
//this is an iPod/iPhone
return NO;
}
#else
//can not pissible be iPad
return NO;
#endif
}
楽しい!