在iOS 7中移动状态栏

我面临的问题是这样的:

我想实现一个好的devise和左/右菜单的iOS 7应用程序,它出现在主视图animation自己的右/左后。 我正在用[UIView animateWithDuration...]代码来做这[UIView animateWithDuration...] ,但这并不重要。 我想达到的效果与Mailbox iOS 7应用程序具有的效果相同:使用主视图移动状态栏(向右/向左)

图像更好的解释:

带有状态栏的邮箱应用程序移到了一边

我只find这篇关于这个问题的文章,其中一些工作代码使用私有API,我不想使用,因为我希望我的应用在App Store上被接受。

我想达到同样的效果(“合法”)。 有谁知道如何?

谢谢!

它的要点是使用iOS 7引入的这种方法:

https://developer.apple.com/documentation/uikit/uiscreen/1617814-snapshotview

这样你就可以得到一个包含状态栏的屏幕截图。 一旦你有了这个,只是隐藏你当前的观点,然后推动截图视图。

我在这里发布了一个概念validation: https : //github.com/simonholroyd/StatusBarTest

注意我没有提交通过苹果审查过程这样做的代码,但这不是一个私有的API方法。

所以,在Simon Holroyd先生最初的推动和一些search之后,我find了解决scheme来实现这个“效果”function。 这是代码:

 statusbarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)]; 

编辑:先生pcholberg正确地指出,前代码没有在实际的设备上工作,只在iOS模拟器,所以我已经编辑他的build议

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { UIView *screenShot = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO]; [statusbarView addSubview:screenShot]; [statusbarView setClipsToBounds:YES]; [self.view addSubview:statusbarView]; [self setPrefersStatusBarHidden:YES]; [self prefersStatusBarHidden]; [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; } 

 - (BOOL)prefersStatusBarHidden { return prefersStatusBarHidden; } 

所以第一部分创build上下文,使用Simon提到的方法,用状态栏绘制视图,并将其保存为UIImage

第二部分将快照UIView添加到我的viewController的UIView

第三部分将我的bool状态栏设置为YES(为了在上面的方法中更容易使用),并调用方法来重绘它

这然后将UIView设置为无function的状态栏在它的地方,并隐藏原来的,所以没有双重呈现。 然后我可以在我的[UIView animateWithDuration...方法中使用这个视图

而当我返回时,我在animation块的完成处理程序中使用此代码:

 [statusbarView removeFromSuperview]; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { [self setPrefersStatusBarHidden:NO]; [self prefersStatusBarHidden]; [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; } 

瞧! 这在我的问题中作为描述的效果。

希望这有助于某人!

我使用这个方法移动滑块视图的雕像栏,在一个应用程序中有两个窗口,一个正常的窗口,其他statuBarWindow,我得到statuBarView其中superView是statuBarWindows,并用滑块视图移动它。

 - (UIView *)statuBarView { NSString *key = [[NSString alloc] initWithData:[NSData dataWithBytes:(unsigned char []){0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x61, 0x72} length:9] encoding:NSASCIIStringEncoding]; id object = [UIApplication sharedApplication]; UIView *statusBar = nil; if ([object respondsToSelector:NSSelectorFromString(key)]) { statusBar = [object valueForKey:key]; } return statusBar; } 

我刚刚创build了BSPanViewController ,这使得它非常容易实现这种效果。 有关如何使用它的控制和说明可以在GitHub上find 。

这个实现和Simon Holroyd解释的一样。

根据我的经验,App Store评论者通常不关心私有API的使用,特别是这个简单而无害的使用。 对于这个任务,你可以通过几种方法获得应用程序状态栏视图的指针,你可以在iOS中find完整的头文件,例如https://github.com/nst/iOS-Runtime-Headers