だから私は設定しているカスタムコンテナビューコントローラを持っており、プレースホルダービューから一時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) です。ページ以外のサイズはすべて異なるため、残りは画面間をどれだけ移動する必要があるかです。さらに情報が必要な場合は、お知らせください。