gpt4 book ai didi

ios - 处理应用程序 :willChangeStatusBarFrame:

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:05:15 26 4
gpt4 key购买 nike

在我的应用中,我通过简单地缩放整个窗口以适应剩余的屏幕空间来处理状态栏框架的变化:

- (void)application:(UIApplication *)application willChangeStatusBarFrame:
(CGRect)newStatusBarFrame {

UIView* window = [UIApplication sharedApplication].keyWindow;

[UIView animateWithDuration:1 / 3.f animations:^{
CGFloat heightDifference = newStatusBarFrame.size.height -
kWXDefaultStatusBarHeight;

[window setTransform:CGAffineTransformMakeScale(1.f,
heightScaleForCallStatusBar())];
[window setFrame:CGRectOffset(window.frame, 0, heightDifference -
kWXDefaultStatusBarHeight / 2)];
}];
}

这可行,但是如果窗口在调用期间缩小并且我使用 -presentViewController:animated:completion: 呈现 View Controller ,新 Controller 不使用缩放坐标系,它使用了一个未缩放的,并且 UI 被破坏了。知道如何让窗口的 .transform 转移到呈现的新 View Controller 吗?

或者,是否有另一种方法可以在不重新排列所有 UI 元素的情况下处理通话状态栏?

最佳答案

每个 View Controller 都会将其 View 的框架设置为可用空间。处理此问题的最简单方法是确保您的 View 的 springs-and-struts 或自动布局属性允许压缩或扩展 View 。随着 iPhone 世界现在包括多种屏幕尺寸,这是一个很好的通用做法。

但是,如果您打算在 View 上使用转换来处理调整大小,您可以在 View Controller (可能在公共(public)基类中)中实现 -viewWillLayoutSubviews 来设置转换 View Controller 的 Root View 。

编辑:

经调查,通话中状态栏的更改似乎不会导致调用 -viewWillLayoutSubviews。但是,以下代码(在一个公共(public) View Controller 基类中)对我有用:

- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(statusFrameChanged:)
name:UIApplicationWillChangeStatusBarFrameNotification
object:nil];
}

- (void)viewDidUnload
{
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIApplicationWillChangeStatusBarFrameNotification
object:nil];
[super viewDidUnload];
}

- (void)statusFrameChanged:(NSNotification*)note
{
CGRect statusBarFrame = [note.userInfo[UIApplicationStatusBarFrameUserInfoKey] CGRectValue];
CGFloat statusHeight = statusBarFrame.size.height;

UIScreen *screen = [UIScreen mainScreen];
CGRect viewRect = screen.bounds;

viewRect.size.height -= statusHeight;
viewRect.origin.y = statusHeight;
self.view.frame = viewRect;
[self.view setNeedsLayout];
}

- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];

CGRect baseFrame = self.view.frame;
// 548.0 is the full height of the view. Update as necessary.
CGFloat scale = self.view.frame.size.height / 548.0;
[self.view setTransform:CGAffineTransformMakeScale(1.0, scale)];
self.view.frame = baseFrame;
}

关于ios - 处理应用程序 :willChangeStatusBarFrame:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15104022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com