【问题标题】:Cannot get frame or center for elements inside UIView that is inside UITableView无法获取 UITableView 内的 UIView 内元素的框架或中心
【发布时间】:2013-04-07 18:10:04
【问题描述】:

我有一个 UITableView,其中首先是表视图部分,然后是 UIView(绑定到 IBOutlet _myView),里面有一些控件(例如 UITextField,绑定到 IBOutlet _durationField)。所有这些都在情节提要中完成。我想动态移动那个 _durationField,所以我需要修改中心或框架属性。但是,viewDidLoad 中的这段代码返回零值:

CGRect durationRect = _durationField.frame;

而 TableCell 和 _myView 框架属性中的标签返回真实值,例如这不会返回零:

CGRect viewRect = _myView.frame;

此外,更改 _durationField 的 frame 属性不会反映在 UI 中。实际上,我为 _myView 中的所有控件获得了零值,尽管它们在代码中正确绑定到 IBOutlet。此外,我可以在 viewDidLoad 中设置 _durationField.text 并且效果很好。

有什么想法吗?看起来我错过了一些简单的东西。

viewWillLayoutSubviews 的第一个建议解决方案确实允许移动元素,但只能在呈现视图之后。所以用户可以看到它是如何移动的。这不是一个理想的行为。我想在呈现视图之前动态移动元素。

【问题讨论】:

    标签: objective-c uitableview frame


    【解决方案1】:

    在viewDidLoad中,UI还没有布局,你应该把调整框架的代码移到viewWillLayoutSubviews(确保你先调用超类实现)

    【讨论】:

    • 谢谢!它确实解决了这个问题。虽然将自定义代码添加到仅在初始加载期间被多次调用的函数中有点令人怀疑(实际上对我来说它被调用了三次)。
    • 其实并没有完全解决问题。现在元素在视图渲染后开始移动。所以用户可以看到它是如何移动的。
    • 如果具有控件的视图是 TableViewCell,那么您应该在 cellForRowAtIndexPath 中为表格设置定位。在正常情况下 viewWillLayoutSubviews 将在视图显示之前被调用(以及在方向更改或其他调整父视图大小的更改时)
    • 不,控件位于简单的 UIView 内部,而 UIView 本身又位于 UITableView 内部。顺便说一句,UITableView 内部也有控件,但它们没有问题,我可以在 viewDidLoad 中获取中心和框架值。正如我所说,对我来说,viewWillLayoutSubviews 被连续调用了 3 次。第一次中心和帧的值为零,第二次和第三次非零。第二次修改center没用,第三次viewWillLayoutSubviews在UI渲染完成后调用。结果,最后第三次调用移动了我的控件。
    • 你可以在 viewWillAppear 中尝试你的布局,但通常在最新的 iOS 中,viewWillLayoutSubviews 通常是最好的(即使你得到多个)。您也可以在 viewDidLayoutSubviews 中尝试,但不确定这是否会有所作为。
    猜你喜欢
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2021-01-13
    相关资源
    最近更新 更多