在滑动状态栏的地图应用中再现苹果效果
Reproducing Apple effects in the map app sliding the Status Bar
我正在尝试复制地图应用程序中的效果,通过触摸地图,顶部和底部栏以及沿着它们的状态栏再次滑动,甚至在 iOS 7 上,当然也在iOS 8 在我自己的应用程序中。
当然,我在滑动我的工件时没有问题,但是状态栏让我感到困惑,我无法让它在 iOS 8 上滑动,更不用说在 iOS 7 上滑动了。我能达到的最好的是通过覆盖 prefersStatusBarHidden 使其淡化;什么当然不适合一般的滑动运动。
如何才能做到这一点?
你可以这样做:
UIWindow *statusBarWindow = (UIWindow *)[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"];
if([statusBarWindow isKindOfClass:[UIWindow class]]){
CGRect frame = statusBarWindow.frame;
if(frame.origin.y < 0){
frame.origin.y = 0;
}
else{
frame.origin.y = -20;
}
[UIView animateWithDuration:0.15 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
statusBarWindow.frame = frame;
} completion:nil];
}
感谢 Tommy 的提示,这是我最终实现的控件:
BOOL controlsWereShown=YES;
-(void)toggleControls{
UIWindow *statusBarWindow = (UIWindow *)[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"];
CGRect frame=CGRectZero;
if([statusBarWindow isKindOfClass:[UIWindow class]]){
frame= statusBarWindow.frame;
if(frame.origin.y < 0){
frame.origin.y = 0;
}
else{
frame.origin.y = -85;
}
}
[UIView animateWithDuration:.8 animations:^{
self.barConstraint.constant=(controlsWereShown?-85:19);
self.bottomConstraint.constant=(controlsWereShown?50:0);
self.renewalViewConstraint.constant=(controlsWereShown?-120:0);
controlsWereShown=!controlsWereShown;
if (frame.size.width != 0) statusBarWindow.frame = frame;
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate) withObject:nil];
[self.view layoutIfNeeded];
}
completion :^(BOOL finished){
}
];
}
该解决方案的唯一问题是状态栏与顶部栏一起滑动,而不是在滑动时保持附着在顶部栏上。我通过将结束原点设置为 -85 而不是 -20 来修复它,以便在滑动时跟随栏。
我正在尝试复制地图应用程序中的效果,通过触摸地图,顶部和底部栏以及沿着它们的状态栏再次滑动,甚至在 iOS 7 上,当然也在iOS 8 在我自己的应用程序中。 当然,我在滑动我的工件时没有问题,但是状态栏让我感到困惑,我无法让它在 iOS 8 上滑动,更不用说在 iOS 7 上滑动了。我能达到的最好的是通过覆盖 prefersStatusBarHidden 使其淡化;什么当然不适合一般的滑动运动。
如何才能做到这一点?
你可以这样做:
UIWindow *statusBarWindow = (UIWindow *)[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"];
if([statusBarWindow isKindOfClass:[UIWindow class]]){
CGRect frame = statusBarWindow.frame;
if(frame.origin.y < 0){
frame.origin.y = 0;
}
else{
frame.origin.y = -20;
}
[UIView animateWithDuration:0.15 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
statusBarWindow.frame = frame;
} completion:nil];
}
感谢 Tommy 的提示,这是我最终实现的控件:
BOOL controlsWereShown=YES;
-(void)toggleControls{
UIWindow *statusBarWindow = (UIWindow *)[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"];
CGRect frame=CGRectZero;
if([statusBarWindow isKindOfClass:[UIWindow class]]){
frame= statusBarWindow.frame;
if(frame.origin.y < 0){
frame.origin.y = 0;
}
else{
frame.origin.y = -85;
}
}
[UIView animateWithDuration:.8 animations:^{
self.barConstraint.constant=(controlsWereShown?-85:19);
self.bottomConstraint.constant=(controlsWereShown?50:0);
self.renewalViewConstraint.constant=(controlsWereShown?-120:0);
controlsWereShown=!controlsWereShown;
if (frame.size.width != 0) statusBarWindow.frame = frame;
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate) withObject:nil];
[self.view layoutIfNeeded];
}
completion :^(BOOL finished){
}
];
}
该解决方案的唯一问题是状态栏与顶部栏一起滑动,而不是在滑动时保持附着在顶部栏上。我通过将结束原点设置为 -85 而不是 -20 来修复它,以便在滑动时跟随栏。