移动iOS 7中的状态栏

Gyf*_*fis 36 iphone objective-c statusbar ios ios7

我面临的问题是:

我想实现一个具有漂亮设计和左/右菜单的iOS 7应用程序,它在主视图自动向右/向左显示.我正在使用[UIView animateWithDuration...]代码执行此操作,但这并不重要.我想要实现的是与邮箱iOS 7应用程序相同的效果:使用主视图移动状态栏(向右/向左)

图片有更好的解释:

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

我才发现是这个文章对这个问题,使用私人API的,我想没有用,因为我想我的应用程序在App Store接受其中的一些工作代码.

我想达到同样的效果('合法').有谁知道怎么做?

谢谢!

Sim*_*oyd 48

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

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

有了它你会得到一个UIView包含一个包含状态栏的屏幕截图.一旦你拥有了它,只需隐藏你当前的视图然后推动截屏视图.

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

注意我还没有提交通过Apple审核流程执行此操作的代码,但这不是私有API方法.

  • 如果您使用此功能进一步移动,还有其他需要注意的事项:邮箱应用程序有一个错误,当您执行多任务时,它显示的屏幕截图不会抑制状态栏.因此,如果您在打开左侧菜单的情况下退出应用程序,然后执行多任务,您将在多任务处理视图中看到重复的状态栏. (5认同)
  • 你问如何达到同样的效果!就是这样,一种效果. (2认同)

Gyf*_*fis 7

因此,在Simon Holroyd先生的初步推动和一些搜索之后,我找到了如何实现这种"效果"功能的解决方案.这是代码:

statusbarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
Run Code Online (Sandbox Code Playgroud)

编辑:pcholberg先生正确地指出前代码在实际设备上不起作用,只在iOS模拟器上,所以我按照他的推荐编辑了它

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)];
}
Run Code Online (Sandbox Code Playgroud)

...

- (BOOL)prefersStatusBarHidden
{
    return prefersStatusBarHidden;
}
Run Code Online (Sandbox Code Playgroud)

...


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

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

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

然后,将UIView设置为其位置的非功能状态栏并隐藏原始状态栏,因此不存在双重渲染.然后我可以在我的[UIView animateWithDuration...方法中使用此视图

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

[statusbarView removeFromSuperview];

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{

    [self setPrefersStatusBarHidden:NO];
    [self prefersStatusBarHidden];
    [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];

}
Run Code Online (Sandbox Code Playgroud)

瞧!这在我的问题中起到了描述效果的作用.

希望这有助于某人!


sig*_*nal 7

我使用这种方法移动带有滑块视图的雕像栏,在应用程序中有两个窗口,一个普通窗口,另一个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;
}
Run Code Online (Sandbox Code Playgroud)