gpt4 book ai didi

ios - 如何获得与方向相关的屏幕高度和宽度?

转载 作者:IT王子 更新时间:2023-10-29 07:29:29 24 4
gpt4 key购买 nike

我正在尝试以编程方式确定我的应用程序的当前高度和宽度。我用这个:

CGRect screenRect = [[UIScreen mainScreen] bounds];

但这会产生 320 的宽度和 480 的高度,无论设备是纵向还是横向。如何确定主屏幕的当前宽度和高度(即取决于设备方向)?

最佳答案

您可以使用类似 UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation) 的东西来确定方向,然后相应地使用尺寸。

但是,在 UIViewController 的方向更改期间

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
duration:(NSTimeInterval)duration

使用 toInterfaceOrientation 中传递的方向,因为 UIApplication 的 statusBarOrientation 仍将指向旧方向,因为它尚未更改(因为您在 will 事件处理程序中).

总结

有几个相关的帖子,但每个帖子似乎都表明你必须:

  1. 查看 [[UIScreen mainScreen] bounds] 以获得尺寸,
  2. 检查您的方向,以及
  3. 考虑状态栏高度(如果显示)

链接

工作代码

我通常不会走这么远,但你激起了我的兴趣。下面的代码应该可以解决问题。我在 UIApplication 上写了一个 Category。我添加了用于获取给定方向的 currentSize 或大小的类方法,这就是您在 UIViewController 的 willRotateToInterfaceOrientation:duration: 中调用的方法。

@interface UIApplication (AppDimensions)
+(CGSize) currentSize;
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation;
@end

@implementation UIApplication (AppDimensions)

+(CGSize) currentSize
{
return [UIApplication sizeInOrientation:[UIApplication sharedApplication].statusBarOrientation];
}

+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation
{
CGSize size = [UIScreen mainScreen].bounds.size;
UIApplication *application = [UIApplication sharedApplication];
if (UIInterfaceOrientationIsLandscape(orientation))
{
size = CGSizeMake(size.height, size.width);
}
if (application.statusBarHidden == NO)
{
size.height -= MIN(application.statusBarFrame.size.width, application.statusBarFrame.size.height);
}
return size;
}

@end

要使用代码,只需调用 [UIApplication currentSize]。另外,我运行了上面的代码,所以我知道它可以工作并报告所有方向的正确响应。请注意,我考虑了状态栏。有趣的是,我不得不减去状态栏高度和宽度的 MIN。

希望这对您有所帮助。 :D

其他想法

您可以通过查看 UIWindow 的 rootViewController 属性来获取尺寸。我过去看过这个,它在纵向和横向上同样报告了相同的尺寸,除了它报告有一个旋转变换:

(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] view]

<UILayoutContainerView: 0xf7296f0; frame = (0 0; 320 480); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0xf729b80>>

(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] view]

<UILayoutContainerView: 0xf7296f0; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0xf729b80>>

不确定您的应用程序如何工作,但如果您没有使用某种导航 Controller ,您可以在主视图下有一个 UIView,它具有父级的最大高度/宽度并随父级增长/收缩。然后你可以这样做:[[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame]。这在一行中看起来非常激烈,但你明白了。

不过……总结下还是做上面3步比较好。开始弄乱 UIWindows,你会发现奇怪的东西,比如显示 UIAlertView 会改变 UIApplication 的键窗口,指向 UIAlertView 创建的新 UIWindow。谁知道?在发现一个依赖 keyWindow 的错误并发现它改变成那样后,我做了!

关于ios - 如何获得与方向相关的屏幕高度和宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7905432/

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