长话短说,我有一个视图控制器,用户可以在其中点击self.view
(导航栏以外的任何地方),它将进入全屏模式,底部的控件淡出,导航和状态栏淡出。类似于 iBooks。
我可以简单地淡化导航栏的 alpha,但是为了允许用户点击新获得的区域(导航栏现在已经淡出)并让它做一些事情,我要做的不仅仅是改变alpha,因为从技术上讲,导航栏仍然占据区域。
所以我用隐藏导航栏[self.navigationController setNavigationBarHidden:YES animated:NO];
。我必须在动画块完成后执行此操作,否则它将在动画块中并作为块的一部分进行动画处理。所以我用 adispatch_after
让它在动画完成后完成(延迟 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;
}
}
我唯一要做的另一件事是更改我的自动布局约束上的常量,以根据导航栏和状态栏是否存在来考虑它们。
我不确定如何考虑双击确实会导致全屏过程出现故障的事实。我怎么能做到这一点,如果他们在动画过程中点击它只会取消动画并按预期执行他们想要的动作?我可以更好地完成这个过程吗?