【问题标题】:Moving status bar in iOS 7在 iOS 7 中移动状态栏
【发布时间】:2013-10-01 05:00:47
【问题描述】:

我面临的问题是:

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

图片以获得更好的解释:

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

我想达到同样的效果(“合法”)。有人知道怎么做吗?

谢谢!

【问题讨论】:

  • 邮箱似乎没有使用标准状态栏。他们在那里粘贴了额外的文字,所以我猜他们使用的是 github.com/myell0w/MTStatusBarOverlay 之类的东西,但已针对 iOS 7 进行了更新。
  • 创建一个容器控制器并将您的菜单和主视图添加为 childViewControllers。然后你可以设置隐藏在菜单控制器中的状态栏,它会保留另一个视图控制器的状态栏,而不使用截图(在我看来这不太棒)。
  • @user 你有示例项目吗?如果是的话,你能分享一下这个吗?

标签: iphone ios objective-c ios7 statusbar


【解决方案1】:

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

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

这样,您将获得一个 UIView,其中包含一个包含状态栏的屏幕截图。一旦你有了它,你只需要隐藏你当前的视图然后推送屏幕截图视图。

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

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

【讨论】:

  • 这看起来很有趣,我会研究一下并报告我的发现!
  • 如果您进一步使用此功能,还有一点需要注意:邮箱应用程序有一个错误,当您执行多任务时,它显示的屏幕截图不会抑制状态栏。因此,如果您在左侧菜单打开的情况下退出应用程序,然后执行多任务处理,您将在多任务处理视图中看到重复的状态栏。
  • 这其实很好知道!他们不是神 :) 谢谢!
  • 尽管看起来,邮箱应用程序以相同的方式执行此操作,因为状态栏在离开屏幕时不会改变。我现在唯一想到的就是“破产了!”
  • 你问如何达到同样的效果!就是这样,一种效果。
【解决方案2】:

所以,经过 Simon Holroyd 先生的初步推动和一番搜索,我找到了如何实现这种“效果”功能的解决方案。这是代码:

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

编辑: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)];
}

...

- (BOOL)prefersStatusBarHidden
{
    return prefersStatusBarHidden;
}

...


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

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

第三部分将状态栏的我的布尔值设置为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)];

}

瞧!这就像我的问题中描述的效果一样。

希望这对某人有所帮助!

【讨论】:

  • 不要将snapshotView ([[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO]) 渲染成图片,snapshot 在真机状态栏上会出现无文字。只需将此 shanpshot 添加为子视图。
  • 你完全正确!这在某种程度上适用于模拟器,但不适用于实际设备。但我无法将快照添加为子视图并在之后移动它,因为它似乎在一段时间后发生了变化......
  • 代码中[self prefersStatusBarHidden]; 的目的是什么,因为您没有对返回值做任何事情?为什么你必须做[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; 而不仅仅是[self setNeedsStatusBarAppearanceUpdate]?如果您的代码在没有这些行的情况下无法运行,我将不愿意在应用程序中使用它,因为它可能会突然停止使用新的 iOS 版本。
  • 我已经覆盖了方法 prefersStatusBarHidden,它现在返回一个布尔值 - prefersStatusBarHidden(现在我看到了,我以同样的方式命名它们是相当奇怪的!)。关于选择器 - 我不太确定,它可能是对大量调整和更改的一些参考,因此整个效果都会起作用。
【解决方案3】:

我使用这种方法来移动带有滑块视图的状态栏,在一个应用程序中有两个窗口,一个普通窗口,另一个 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;
}

【讨论】:

  • 这很有趣..这被认为是使用苹果私有 API 吗?另外,你为什么使用 dataWithBytes 而不是 @"statusBar" 这就是它变成的......是为了以某种方式避免检测吗? (似乎他们会检查这个简单的工作......)
【解决方案4】:

我刚刚创建了BSPanViewController,这使得实现这个效果变得非常容易。控制和使用说明可以是found on GitHub

实现与explained by Simon Holroyd的相同。

【讨论】:

    【解决方案5】:

    根据我的经验,App Store 评论者通常不关心私有 API 的使用,尤其是这种简单且无害的。 对于该任务,您可以通过多种方法获得指向应用程序状态栏视图的指针,您可以在 iOS 完整标题中找到这些方法,例如 https://github.com/nst/iOS-Runtime-Headers

    【讨论】:

    • 如果你侥幸使用了私有 API,那就是反常了。违反规则的风险很大,我不建议人们尝试。
    猜你喜欢
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2015-06-04
    相关资源
    最近更新 更多