SplitView详细信息视图返回错误的视图框架?

时间:2011-03-03 09:05:59

标签: ios cocoa-touch ipad uiview uisplitviewcontroller

我在iPad应用中使用了splitView。详细视图中有2个子视图,它根据etail视图边界绘制自己。 问题是,即使ipad处于横向模式,它们总是在(1024,768)中绘制自己。

顺便说一句 - 如果我在纵向模式下调用然后旋转ipad,它们会缩放到(706,768)。

我已经检查了详细视图框架和边界(在视图中执行了加载方法),在这两种情况下我得到了这个:

NSLog(@"screen frame = %@",NSStringFromCGRect(self.view.frame));
NSLog(@"screen bounds = %@",NSStringFromCGRect(self.view.bounds));

在调试窗口中,我得到:

2011-03-03 10:58:19.376 English Club[63347:207] screen frame = {{0, 0}, {768, 1024}}
2011-03-03 10:58:19.382 English Club[63347:207] screen bounds = {{0, 0}, {768, 1024}}

我无法找出问题所在。任何人都可以帮助我吗?

感谢您的帮助。

6 个答案:

答案 0 :(得分:6)

viewDidLoad中,视图不应具有其实际大小。稍后通过布局方法设置。但这不应该阻止你:)你如何设置你的自动化掩码?如果你已正确设置,一切都应该没问题。

答案 1 :(得分:4)

如果你等待 - (void)viewDidLayoutSubviews 它的大小合适

答案 2 :(得分:3)

在viewWillAppear而不是viewDidLoad中执行操作。

答案 3 :(得分:2)

我目前正在编写一个UISplitViewController应用程序,并且发现更改详细信息或主视图的大小是被禁止的。它完全负责那些子帧的大小。

与UINavigationController和UITabBarController一样,UISplitViewController是一个“容器”视图控制器,它根据其目的对其子视图进行整形。

函数self debugDumpTheFrames打印出uisplitviewcontroller的帧,它是两个子帧。我在splitViewController的viewDidLoad中打印帧,并设置一个定时器,在2秒后第二次调用此函数(在此期间我什么都不做):

[self debugDumpTheFrames];
NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:2.0f target:self selector:@selector(debugDumpTheFrames) userInfo:nil repeats:NO];

如果我们查看输出,我们可以看到在viewdidload之后的某个时候,UISplitViewController已经改变了它的子视图的帧。

size of splitviewcontrollers view frame {{0, 0}, {748, 1024}}
size of splitviewcontrollers detail view frame {{0, 0}, {768, 1024}}
size of splitviewcontrollers master view frame {{0, 0}, {768, 1024}}

size of splitviewcontrollers view frame {{0, 0}, {748, 1024}}
size of splitviewcontrollers detail view frame {{321, 0}, {703, 748}}
size of splitviewcontrollers master view frame {{0, 0}, {320, 748}}

确切地说,这个调整大小我不确定;但uisplitviewcontroller是这些框架的老板,它们是私人财产,所以触摸它们是商店拒绝的理由。

答案 4 :(得分:1)

是如果您已设置自动调整属性,则应该没问题。

您可以通过笔尖或代码

设置它们
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

...欢呼声

答案 5 :(得分:0)

如果确实需要在viewDidLoad中获得正确的宽度,则可以访问拆分视图控制器并获取详细视图控制器的宽度。

E.g。在斯威夫特:

func getDetailViewSize() -> CGSize {
    var detailViewController: UIViewController
    if (self.splitViewController?.viewControllers.count > 1) {
        detailViewController = self.splitViewController?.viewControllers[1] as! UIViewController
    } else {
        detailViewController = self.splitViewController?.viewControllers[0] as! UIViewController
    }
    return detailViewController.view.frame.size
}