gpt4 book ai didi

ios - iOS 旋转后 subview Controller 高度为零

转载 作者:可可西里 更新时间:2023-11-01 05:44:12 25 4
gpt4 key购买 nike

我一直在搜索,但找不到我遇到的这个问题的答案。这看起来相当基础,所以希望有人能解释一下,或者指出我以前的帖子。

当添加一个 View Controller 的 View 作为另一个 View Controller 的 subview 时,我发现 subview 的高度属性在旋转时变为零。宽度也趋于增加。

例如,在 xib 文件中将 NSDChildViewController 的 View 设置为 50x100...

@implementation ParentViewController

-(void)viewDidLoad
{
[super viewDidLoad];
mChild = [[ChildViewController alloc] initWithNibName:nil
bundle:nil];
[self.view addSubview:mChild.view];
}

-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
[mChild printFrame];
}
@end

@implementation ChildViewController

-(void)printFrame
{
NSLog(@"%s %@",__FUNCTION__, NSStringFromCGRect(self.view.frame));
}
@end

portrait->landscape->portrait各个方向的logging如下:

-[ChildViewController printFrame] {{0, 0}, {50, 100}}

-[ChildViewController printFrame] {{0, 0}, {298, 0}}

-[ChildViewController printFrame] {{0, 0}, {50, 248}}

为什么会发生这种情况,我该如何预防?目前,它在尝试以编程方式将 View Controller 布局为 subview 时给我带来了麻烦。到目前为止我找到的唯一解决方案是使用类似这样的方法将 size 属性强制回 50x100...

-(void)forceSize
{
CGRect frame = self.view.frame;
frame.size.width=50;
frame.size.height=100;
self.view.frame=frame;
}

但上面的内容看起来很可笑。任何帮助表示赞赏。

最佳答案

您的父 View 会在其框架更改时自动调整其 subview 的大小。在这种情况下,当设备在纵向和横向模式之间切换时,父 View 的框架会发生变化。

您似乎是在 4 英寸 iPhone 设备(或模拟器)上进行测试,因此我们使用的尺寸是:320 x 568。父 View 占用了屏幕的全部宽度和高度。

这是发生了什么:

在从纵向旋转到横向之前:

widthDifference = parentViewWidth - originalChildViewWidth      // 270 (320 - 50)
heightDifference = parentViewHeight - originalChildViewHeight // 468 (568 - 100)

从纵向旋转到横向后:

childLandscapeViewWidth = parentViewHeight - widthDifference    // 298 (568 - 270)
childLandscapeViewHeight = parentViewWidth - heightDifference // -148 (320 - 468)
// (but height cannot be < 0, so this is automatically set to 0)

所以在横向模式下,我们最终得到 subview 的宽度 = 298 和高度 = 0

从横向到纵向旋转之前:

widthDifference = parentViewWidth - childLandscapeViewWidth     // 270 (568 - 298)
heightDifference = parentViewHeight - childLandscapeViewHeight // 320 (320 - 0)

从横向到纵向旋转后:

childPortraitViewWidth = parentViewWidth - widthDifference      // 50 (320 - 270)
childPortraitViewHeight = parentViewHeight - heightDifference // 248 (568 - 320)

最终我们得到 subview 的宽度 = 50 和高度 = 248

因此,为了阻止这种疯狂行为,将父 View (which is YES by default) 上的 autoresizesSubviews 设置为 NO,如下所示:

- (void)viewDidLoad
{
[super viewDidLoad];
self.view.autoresizesSubviews = NO;
...
}

关于ios - iOS 旋转后 subview Controller 高度为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25731676/

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