2011-03-03 97 views
18

我在iPad应用程序中使用了splitView。详细视图中有2个子视图,根据etail视图边界绘制自己。 问题在于,即使在ipad处于横向模式时,他们也总是将自己吸引到(1024,768)中。SplitView详细视图返回错误的视图框?

顺便说一句 - 如果我打电话然后在肖像模式,然后旋转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}} 

我找不到问题出在哪里。谁能帮我?

感谢您的任何帮助。

+0

我也注意到这个奇怪的问题。我会建议向苹果提交一份错误报告 - 这就是我所做的。 http://bugreporter.apple.com – Jasarien 2011-03-03 09:59:48

+2

苹果回答了这个bug提交吗?顺便说一句,你如何将这些子视图添加到主视图?你是否正确设置了它们的autoresize属性?你能向我们展示更多的代码来深入了解你的问题吗?谢谢 – marzapower 2011-06-07 07:34:16

+0

那么,你在这里究竟想要做什么?你想设置详细视图的大小。或内部细节视图中的视图。您可以在详细信息视图中设置视图的框架大小,但不能设置详细信息视图的大小,因为根据splitviewcontroller视图的基本大小将保持标准。如果你有不同的问题,请让我知道。 – AppAspect 2011-06-20 17:34:38

回答

6

viewDidLoad该视图不应该有其实际大小。这是由布局方法稍后设置的。但是这不应该阻止你:)你如何设置你的自动识别面具?如果你设置正确,一切都应该没问题。

+0

谢谢,我会再次检查它。 – shannoga 2012-01-13 07:32:21

1

是如果你已经设置会自动调整大小属性应该是确定..

您可以通过笔尖或代码

self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; 

欢呼设置它们...

+0

谢谢,我会尝试 – shannoga 2011-12-12 08:03:17

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是这些框架的老板,他们是私人物业,所以触摸他们是从商店拒绝的理由。

3

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

4

,如果你等待 - (无效)viewDidLayoutSubviews 它将有合适的尺寸

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 
}