0

こんにちは、私はこれを実装するためのいくつかの異なる方法をいじりましたが、何も機能しないようです。私が探しているのは、上部にツールバーがある標準のUIPageViewcontrollerを使用し、左上のツールバーボタンを押すと、PageViewが右側にスライドし(PathやFacebookなど)、tableViewが表示されます。

どちらかを個別に動作させることは問題ありませんが、これらの複数のビューコントローラをappDelegateと連携させるのに苦労しています。私は主にViewDeckを使用しています:https ://github.com/Inferis/ViewDeckをスライドアウトの実装に使用していますが、pageviewcontrollerを使用して実装するのが簡単な別の方法がある場合は、間違いなくオープンです。

まだ概念的に理解しようとしているだけなので、コードを投稿することはあまりありません。

助けてくれてありがとう!

4

1 に答える 1

0

編集後:

やりたいことをやるには、次のコントローラーをページ ビュー コントローラー (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];
}
于 2013-01-07T23:07:31.950 に答える