編集後:
やりたいことをやるには、次のコントローラーをページ ビュー コントローラー (DataViewController の self.parentViewController) の子ビュー コントローラーとして追加するのが最適だと思います。
#import "DataViewController.h"
#import "NextController.h"
#import "ModelController.h"
@implementation DataViewController {
BOOL viewRevealed;
NextController *next;
}
- (void)viewDidLoad {
[super viewDidLoad];
viewRevealed = NO;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.dataLabel.text = [self.dataObject description];
}
-(IBAction)slideInController:(UIButton *) sender {
if (viewRevealed == NO) {
next = [self.storyboard instantiateViewControllerWithIdentifier:@"Blue"];
next.view.frame = self.parentViewController.view.frame;
[self.parentViewController addChildViewController:next];
[self.parentViewController.view insertSubview:next.view belowSubview:self.view];
[next didMoveToParentViewController:self.parentViewController];
[UIView animateWithDuration:.6 animations:^{
self.view.frame = CGRectMake(self.view.frame.origin.x + self.view.frame.size.width/2, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
} completion:^(BOOL finished) {
viewRevealed = YES;
[(ModelController *)[(UIPageViewController *)self.parentViewController dataSource] setSlidOff:TRUE];
}];
}else{
[UIView animateWithDuration:.6 animations:^{
self.view.frame = CGRectMake(self.view.frame.origin.x - self.view.frame.size.width/2 , self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
} completion:^(BOOL finished) {
[next.view removeFromSuperview];
[next removeFromParentViewController];
viewRevealed = NO;
[(ModelController *)[(UIPageViewController *)self.parentViewController dataSource] setSlidOff:FALSE];
}];
}
}
これが DataViewController 内のすべてのコードです。必要な ivar をいくつか追加しました。テスト アプリでは、slideInController メソッドをダブルタップ ジェスチャ認識エンジンに接続しました。DataView が部分的に画面に表示されているときにクリックまたはスワイプすると奇妙なことが起こるため、ModelController.h ファイル (slidOff) に BOOL プロパティを追加し、そのクラスの init メソッドで FALSE に設定しました。次に、2 つのページ ビュー データ ソース メソッドの if ステートメントに別の条件を追加して、そのプロパティを確認しました。slidOff が TRUE の場合、スワイプ ジェスチャ レコグナイザは何もしません。私が変更した ModelController の 2 つのメソッドを次に示します。
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
NSUInteger index = [self indexOfViewController:(DataViewController *)viewController];
if ((index == 0) || (index == NSNotFound) || _slidOff) {
return nil;
}
index--;
return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
NSUInteger index = [self indexOfViewController:(DataViewController *)viewController];
if (index == NSNotFound || _slidOff) {
return nil;
}
index++;
if (index == [self.pageData count]) {
return nil;
}
return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}