Iphone 布局与布局;UIViewController中子视图的大小调整

Iphone 布局与布局;UIViewController中子视图的大小调整,iphone,cocoa-touch,uikit,uiview,Iphone,Cocoa Touch,Uikit,Uiview,我有一个带有UITabController的应用程序,每个选项卡都是UINavigationController。我的UINavigationControllers之一的根是UIViewController -(void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; // Your layout logic here } 在视图控制器的视图中,我想布局一些子视图,但我不知道在何处以及如何以与分辨率无关的方式布局它

我有一个带有
UITabController
的应用程序,每个选项卡都是
UINavigationController
。我的
UINavigationControllers
之一的根是
UIViewController

-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    // Your layout logic here
}
在视图控制器的视图中,我想布局一些子视图,但我不知道在何处以及如何以与分辨率无关的方式布局它们(即不是硬编码值,如320px、480px、44px等)

当视图完全加载并显示在垂直iPhone上时,其高度将为367px=480-20(状态栏)-44(导航栏)-49(选项卡栏)

在视图控制器中,我当前在
viewDidLoad
方法中创建所有子视图。但是,在这个方法中,视图的当前高度似乎是460px(
self.view.bounds.size.height
)。因此,在设置子视图时,我无法正确计算任何对象的大小

视图将出现:
方法中,视图不知道它的大小是否合适,但这意味着每次视图出现时都要设置和计算子视图的帧(例如,选项卡更改或从导航堆栈上的子视图控制器弹出)

正确执行此操作的唯一方法是在
视图中显示布局:

我尝试过使用自动调整大小属性(父级的
自动调整大小SSUBVIEWS
&
自动调整大小任务
),但它们似乎根本不起作用!这些属性是否仅在视图全部设置完毕后才生效,然后调整大小(手动/方向更改?)


如果有人能告诉我为什么自动缩放不起作用,以及如何通过不硬编码任何尺寸来最好地布局,我将不胜感激。

自动缩放视图应设置在您的父视图上,而
自动缩放任务应设置在子视图上-这是我犯的错误,所以您也可以这样做

loadView
中,您应该调整子视图的大小,以适应当前父视图的任何大小,然后稍后,当父视图从460像素调整到367像素时,您的子视图也将根据上面的遮罩设置调整大小

如果失败,则在
viewwillbeen
中设置视图大小没有问题-每次这样做对性能的影响可以忽略不计


如果其他方法都不起作用,那么总是会有
布局子视图:
-如果必须,您可以在那里进行手动布局,当系统认为布局可能必须更改时,就会调用它。还有
设置需要调整设置:我有时从
视图调用设置需要调整:
/
视图调整调整
:等等。但这确实不应该是必需的ded和autoresize应该足够好了


编辑:是的,要在我上面提到的
layoutSubviews
中实现自定义布局逻辑,需要对
UIView
进行子类化,您可以在
UIViewController
viewWillLayoutSubviews
中执行布局逻辑

-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    // Your layout logic here
}

DOC:在调用视图控制器的视图的layoutSubviews方法之前调用。子类可以根据需要实现。默认为nop。

快速澄清,UIViewController没有,也没有调用layoutSubviews。这是UIView上的一个方法。但是,您可以创建一个名为layoutSubviews的方法,并从viewWillAppe调用它ar:也没有“加载视图”。我想你指的是“viewDidLoad”,在这种情况下,在viewDidUnload中释放这些视图也是值得一提的。有一种加载视图方法,但viewDidLoad通常是添加子视图的最方便的地方,“但实际上这不需要,自动调整大小应该足够好。”在许多情况下,自动调整遮罩的大小是不够的:例如,一个从上到下具有3个等分子视图的视图。值得一提的是,iOS 5.0在视图控制器类中添加了两个新函数
viewWillLayoutSubviews
viewdillayoutsubviews
,这可能会有所帮助。如果使用viewD,有什么区别吗idLayoutSubviews?无需在viewWillLayoutSubviews()或viewDidLayoutSubviews()上调用super:“此方法的默认实现不起任何作用。”区别在于:在任何视图的实际布局完成之前调用名为
Will
的视图(更改其实际布局使用的任何属性的最佳时间),而名称中带有
Did
的可能会导致重新发布!!(但这是破解或覆盖真实布局的最佳位置)。