我一直在寻找,但找不到我遇到的这个问题的答案。这似乎是相当基础的,所以希望有人可以解释,或指向我以前的帖子。
当将viewcontroller的视图添加为另一个viewcontroller的子视图时,我发现子视图的height属性在旋转时变为零。宽度也趋于增加。
例如,在xib文件中将NSDChildViewController的视图设置为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
纵向 - >横向 - >纵向的相应方向的记录如下:
- [ChildViewController printFrame] {{0,0},{50,100}}
- [ChildViewController printFrame] {{0,0},{298,0}}
- [ChildViewController printFrame] {{0,0},{50,248}}
为什么会发生这种情况,我该如何预防呢?目前,在尝试以编程方式将viewcontrollers布局为子视图时,这会给我带来麻烦。到目前为止,我发现的唯一解决方案是使用类似的东西强制将size属性恢复为50x100 ......
-(void)forceSize
{
CGRect frame = self.view.frame;
frame.size.width=50;
frame.size.height=100;
self.view.frame=frame;
}
但上面看起来很荒谬。任何帮助表示赞赏。
答案 0 :(得分:3)
您的父视图会在其帧更改时自动调整其子视图的大小。在这种情况下,当设备在纵向和横向模式之间切换时,父视图的框架会发生变化。
您似乎正在使用4英寸iPhone设备(或模拟器)进行测试,因此我们正在使用的尺寸为:320 x 568.父视图占用了屏幕的整个宽度和高度。
以下是发生的事情:
从纵向旋转到横向之前:
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)
因此在横向模式下,我们最终得到子视图的宽度= 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)
最终我们得到了子视图的宽度= 50和高度= 248
所以,要阻止父视图(which is YES by default)上的这个疯狂集autoresizesSubviews
到NO
,如下所示:
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.autoresizesSubviews = NO;
...
}