【问题标题】:Laying out & sizing of subviews in a UIViewController在 UIViewController 中布局和调整子视图的大小
【发布时间】:2011-01-03 12:12:39
【问题描述】:

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

在该视图控制器的视图中,我想布局一些子视图,但我不知道在哪里以及如何以独立于分辨率的方式布置它们(即不是硬编码值,例如 320px、480px、44px等)。

当视图完全加载并呈现在垂直 iPhone 上时,它的高度将为 367px = 480 - 20(状态栏)- 44(导航栏)- 49(标签栏)。

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

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

viewWillAppear: 中正确布局是唯一的方法吗?

我曾尝试使用自动调整大小属性(父母的autoresizesSubviewsautoresizingMask),但它们似乎根本不起作用!?这些是否只有在视图全部设置好然后调整大小(手动/方向更改?)后才会生效。

如果有人能告诉我为什么自动调整大小不起作用,以及如何通过不对任何大小进行硬编码来最好地布局,我将不胜感激。

【问题讨论】:

    标签: iphone cocoa-touch uikit uiview


    【解决方案1】:

    您可以在UIViewControllerviewWillLayoutSubviews 中执行布局逻辑。

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

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

    【讨论】:

    • 如果我使用 viewDidLayoutSubviews 有什么不同吗?
    • 无需在 viewWillLayoutSubviews() 或 viewDidLayoutSubviews() 上调用 super:“这个方法的默认实现什么都不做。”
    • 不同之处在于:名称中带有Will 的那个被称为任何视图的实际布局完成之前(更改其实际使用的任何属性的最佳时间-布局),而名称为Did 的可能会导致重新布局! (但最好的地方是破解或覆盖真实布局)。
    【解决方案2】:

    autoresizesSubviews 应该设置在你的父视图上,而autoresizingMask 应该设置在子视图上——这是我犯的错误,所以你也可以。

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

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

    如果没有其他工作,总是有layoutSubviews: - 如果需要,您可以在那里进行手动布局,当系统认为布局可能必须更改时调用它。还有 setNeedsLayout: 我有时会从 viewWillRotate:/viewDidRotate: 等调用。但实际上这不应该是必需的,自动调整大小应该足够好。

    编辑:是的,要在layoutSubviews 中实现自定义布局逻辑,正如我上面提到的,需要继承UIView

    【讨论】:

    • 快速澄清一下,UIViewController没有,也没有调用layoutSubviews。这是 UIView 上的一种方法。但是,您可以只创建一个名为 layoutSubviews 的方法并从 viewWillAppear 调用它:
    • 也没有“loadViews”。我认为您的意思是“viewDidLoad”,在这种情况下,值得一提的是在 viewDidUnload 中发布这些视图。
    • 有一个 loadView 方法但是 viewDidLoad 通常是添加子视图最方便的地方
    • "但实际上这不应该是必需的,自动调整大小应该足够好" 有很多情况下自动调整掩码是不够的:例如,从上到下有 3 个等分子视图的视图。
    • 值得一提的是,iOS 5.0 向视图控制器类添加了两个新函数 viewWillLayoutSubviewsviewDidLayoutSubviews,这可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多