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
的可能会导致重新发布!!(但这是破解或覆盖真实布局的最佳位置)。