1

だから私は設定しているカスタムコンテナビューコントローラを持っており、プレースホルダービューから一時UILabelsを取り出すまで完全に機能していた子ビューコントローラ間をスワイプすると発生すると思われるカスタムアニメーションを持っています。子View Controllerからのビューをプレースホルダーに追加しました。「addSubview」行をコメントアウトすると、アニメーションは再び完全に機能しますが、ポイントである子がいないことは明らかです...

ここで、アニメーションが機能しないと言いますが、init で追加したもの (つまり、notify および user プレースホルダーと子) にリンクされているものはすべて完全にアニメーション化されるため、それは完全に真実ではありません。フィード ビューはそれらの下に表示されますが、ヘッダー バーとフッター バーは時々動くだけです。タッチを x 軸だけでなく y 軸にも移動すると、ランダムにピクピクします... 変です。

子 VC を設定および追加するための初期化コード:

UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    self.feedVC = (NiTActionFeedViewController*)[sb instantiateViewControllerWithIdentifier:@"Feed"];
    self.feedVC.delegate = self;
    [self addChildViewController:self.feedVC];
    self.feedVC.view.frame = self.mainPage.bounds;//mainPage view is the only UIView that is placed in the IB as template for the other views (so I don't have to worry about resizing for 4" retina^^;)
    [self.mainPage addSubview:self.feedVC.view];
    [self.feedVC didMoveToParentViewController:self];

    //notify
    self.notifyPage = [[UIView alloc] initWithFrame:CGRectOffset(self.mainPage.frame, -kPageShift, 0)];// this is one of the placeholder views
    [self.notifyPage setClipsToBounds:YES];

    self.notifyVC = (NiTNotificationViewController*)[sb instantiateViewControllerWithIdentifier:@"Notify"];
    self.notifyVC.delegate = self;
    [self addChildViewController:self.notifyVC];
    self.notifyVC.view.frame = self.notifyPage.bounds;
    [self.notifyPage addSubview:self.notifyVC.view];
    [self.notifyVC didMoveToParentViewController:self];

    //user
    self.userPage = [[UIView alloc] initWithFrame:CGRectOffset(self.mainPage.frame, kPageShift, 0)];
    [self.userPage setClipsToBounds:YES];

    self.userVC = (NiTUserViewController*)[sb instantiateViewControllerWithIdentifier:@"UserScreen"];
    self.userVC.delegate = self;
    [self addChildViewController:self.userVC];
    self.userVC.view.frame = self.userPage.bounds;
    [self.userPage addSubview:self.userVC.view];
    [self.userVC didMoveToParentViewController:self];

    [self.view addSubview:self.notifyPage];
    [self.view addSubview:self.userPage];

     //and then re-add the header and footer views so that the children don't cover them^^
    [self.view addSubview:self.headerbar];
    [self.view addSubview:self.headerButton];
    [self.view addSubview:self.footerbar];
    [self.view addSubview:self.footerButton];
    [self.view addSubview:self.rightPageIndicator];
    [self.view addSubview:self.leftPageIndicator];

ここに touchesMoved コードがあります (さらに必要な場合はお知らせください。ただし、最終的には動きません):

if (touches.count > 0) {
        UITouch* touch = [touches anyObject];
        CGPoint currentPoint = [touch locationInView:self.view];
        float diff = currentPoint.x - startingPoint.x;

        //currentScreen is an enum that I set on load and on trigger of the screen change so I always know what screen is showing and it is always accurate
        //this line is just to make sure we don't go past the "edge" of the screen and is working perfectly
        if ((self.currentScreen - (diff<0?-1:1)) > userScreen||(self.currentScreen - (diff<0?-1:1)) < notifScreen) {
            return;
        }


            self.headerbar.frame = CGRectOffset(initheaderbar, (int)(kHeaderBarShift * (diff/kPageShift)), 0);
            self.headerButton.frame = CGRectOffset(initheaderButton, kHeaderButtonShift * (diff/kPageShift), 0);
            self.footerbar.frame = CGRectOffset(initfooterbar, kFooterBarShift * (diff/kPageShift), 0);
            self.mainPage.frame = CGRectOffset(initmainPage, kPageShift * (diff/kPageShift), 0);
            self.userPage.frame = CGRectOffset(inituserPage, kPageShift * (diff/kPageShift), 0);
            self.notifyPage.frame = CGRectOffset(initnotifyPage, kPageShift * (diff/kPageShift), 0);

        //this always updates and looks right even though nothing changes on the screen
            NSLog(@"move main:%@(%@)\nnotify:%@\nuser:  %@",NSStringFromCGRect(CGRectOffset(initmainPage, kPageShift * (diff/kPageShift), 0)),NSStringFromCGRect(self.mainPage.frame),NSStringFromCGRect(CGRectOffset(initnotifyPage, kPageShift * (diff/kPageShift), 0)),NSStringFromCGRect(CGRectOffset(inituserPage, kPageShift * (diff/kPageShift), 0)));

            lastPoint = currentPoint;
    }else{
        //never seen this called thus why I have it here so I know if something mind blowing has happened
        NSLog(@"W.T.F");
    }

さて、おそらく知っておく必要がある最後の部分は、親を指すすべての子に「touchDelegates」を設定できる「touchController」プロトコルを設定して、受け取ったタッチがコンテナに転送されるようにすることです。 VCとそれらはすべて適切に転送されているため、そうではありません(そうである場合、アニメーションはまったく機能しません)...

助けてオビワン・ケノービ、あなただけが頼りです!真剣に、誰でもできるどんな助けも使うことができます^^;

要求された情報 私はほとんどすべてを画面上でアニメーション化しています。プロジェクトの性質上、スクリーンショットやビデオを投稿することはできませんが、下の図を参考にしていただければ幸いです (申し訳ありませんが、私は Photoshop ではありません =P を期待しています)。図に示されていないのは headerButton だけですが、基本的には headerBar の上にあり、それほど遠くまで移動しないため、少し遅いペースで移動します。デザインのアイデアは、ある方向にスワイプすると画面が反対方向にスライドし (予想どおり)、ヘッダー バーとフッター バーが短いため異なる速度でスライドし、それらの項目が常に表示されるようにすることです。 、しかし、あなたがどちらの側/ページにいるかを示すのに「クールな」効果があります. (どちらのバーも画面に「終わり」を表示することはなく、「終わり」は画面の端まで来ますが、決してそこには来ません) すべての定数はまさにそれです。kPageShift は画面幅 (320) です。ページ以外のサイズはすべて異なるため、残りは画面間をどれだけ移動する必要があるかです。さらに情報が必要な場合は、お知らせください。

ここに画像の説明を入力

4

1 に答える 1

3

ストーリーボード ファイルで AutoLayout をオフにします。

設定された制約は、あなたが話したランダムなけいれんを引き起こしています.

ここに画像の説明を入力

于 2013-01-14T18:31:38.557 に答える