簡単に言うと、ユーザーがself.view
(ナビゲーション バー以外の場所で) タップできるビュー コントローラーがあり、下部のコントロールがフェードアウトし、ナビゲーションとステータス バーがフェードアウトするフル スクリーン モードになります。iBooksに似ています。
ナビゲーション バーのアルファを単純にフェードすることもできますが、ユーザーが新しく取得した領域 (ナビゲーション バーがフェードアウトした場所) をタップして何かを実行できるようにするには、アルファ、ナビゲーション バーはまだ技術的に領域を占めているためです。
でナビゲーションバーを非表示にし[self.navigationController setNavigationBarHidden:YES animated:NO];
ます。アニメーション ブロックが終了した後にこれを行う必要があります。そうしないと、アニメーション ブロックに含まれ、ブロックの一部としてアニメーション化されます。dispatch_after
そのため、アニメーションが完了した後に終了させるためにa を使用します(0.35 秒の遅延)。
ただし、これにより、ユーザーが 0.35 秒のアニメーションで終了を待っている間にいつでもタップすると、別のブロックが 0.35 秒待機しているにもかかわらず、別のブロックが開始されるグリッチ動作が発生するという問題が発生します。終わる。これにより、いくつかのグリッチ動作が発生し、ナビゲーション バーが非表示のままになります。きもい。
それが起こっているビデオ: http://cl.ly/2i3H0k0Q1T0V
私がやっていることを示すコードは次のとおりです。
- (void)hideControls:(BOOL)hidden {
self.navigationController.view.backgroundColor = self.view.backgroundColor;
int statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
[UIView animateWithDuration:0.35 animations:^{
[[UIApplication sharedApplication] setStatusBarHidden:hidden withAnimation:UIStatusBarAnimationFade];
if (hidden) {
self.navigationController.navigationBar.alpha = 0.0;
self.instructionsLabel.alpha = 0.0;
self.backFiftyWordsButton.alpha = 0.0;
self.forwardFiftyWordsButton.alpha = 0.0;
self.WPMLabel.alpha = 0.0;
self.timeRemainingLabel.alpha = 0.0;
}
else {
self.navigationController.navigationBar.alpha = 1.0;
self.instructionsLabel.alpha = 1.0;
self.backFiftyWordsButton.alpha = 1.0;
self.forwardFiftyWordsButton.alpha = 1.0;
self.WPMLabel.alpha = 1.0;
self.timeRemainingLabel.alpha = 1.0;
}
[self.view layoutIfNeeded];
}];
// Perform an "actual" hide (more than just alpha changes) after the animation finishes in order to regain that touch area
if (hidden) {
double delayInSeconds = 0.35;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void) {
[self.navigationController setNavigationBarHidden:YES animated:NO];
self.textToReadLabelPositionFromTopConstraint.constant = TEXT_LABEL_DISTANCE + self.navigationController.navigationBar.frame.size.height + statusBarHeight;
});
}
else {
[self.navigationController setNavigationBarHidden:NO animated:NO];
self.textToReadLabelPositionFromTopConstraint.constant = TEXT_LABEL_DISTANCE;
}
}
私が行っている唯一の他のことは、Auto Layout 制約の定数を変更して、そこにあるかどうかに依存するナビゲーション バーとステータス バーを考慮に入れることです。
ダブルタップが実際にフルスクリーンプロセスに不具合を起こす可能性があるという事実をどのように考慮に入れるかはわかりません. アニメーションのプロセス中にタップすると、アニメーションがキャンセルされ、意図したとおりに目的のアクションが実行されるようにするにはどうすればよいですか? このプロセスをもっとうまくやれるでしょうか?