これはトリッキーです。pop/push および present/dismiss メソッドをオーバーライドする UINavigationController のサブクラスがあります。ここでは、UINavigationController サブクラスがポップオーバーに含まれている場合に正しいサイズを設定するように動作をカスタマイズします。派手なことは何もありませんが、すべての ViewController のサブクラスを作成せずに Autolayout を使用するために、このようにしています。
ただし、presentViewController:animated:completion:
andの完了ブロックはdismissViewControllerAnimated:completion:
実行されていません。これは奇妙な部分です。iPhone ではまったく同じコードが正しく動作しますが、iPad ではブロックが実行されません。これがコードサンプルです。
@interface SBNavigationController : UINavigationController
@end
@implementation SBNavigationController
- (void) presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
if ([viewControllerToPresent isKindOfClass:[UINavigationController class]])
{
UINavigationController *nav = (UINavigationController *) viewControllerToPresent;
[nav.topViewController setContentSizeForViewInPopover:kFullSizePopover];
} else
{
[viewControllerToPresent setContentSizeForViewInPopover:kFullSizePopover];
}
viewControllerToPresent.modalPresentationStyle = UIModalPresentationCurrentContext;
[super presentViewController:viewControllerToPresent animated:flag completion:completion];
}
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion ;
{
[super dismissViewControllerAnimated:flag completion:completion];
}
@end
そして、それを使用したコードは次のとおりです。
@implementation SBInviteFBContactViewController
...
- (void) createInviteByMailViewController
{
SBInviteMailViewController *mailInvite = [[SBInviteMailViewController alloc] initWithDelegate:self userInfo:_userInfo];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:mailInvite];
[self.navigationController presentViewController:navController
animated:YES
completion:^{
NSLog(@"presentViewController:");
}];
}
#pragma mark SBInviteMailProtocol
- (void) invitedMailContacts:(NSArray *)contacts;
{
[self.navigationController dismissViewControllerAnimated:YES
completion:^{
NSLog(@"animation Ended");
if (contacts) {
[self.delegate invitedMailContact:contacts];
[self popViewControllerAnimated:YES];
}
}];
}
...
@end
何か案は?