与嵌入式 UITableView 交互后,为啥我的 UIView 的框架会发生意外变化?

Posted

技术标签:

【中文标题】与嵌入式 UITableView 交互后,为啥我的 UIView 的框架会发生意外变化?【英文标题】:Why is my UIView's frame changing unexpectedly after the embedded UITableView is interacted with?与嵌入式 UITableView 交互后,为什么我的 UIView 的框架会发生意外变化? 【发布时间】:2014-05-13 20:51:01 【问题描述】:

考虑以下UIView“MainView”:

该视图包含一个容器视图,该视图又包含一个UITableView 控制器。容器视图的 y 坐标从渐变条的下方开始。 UITableView 在最底部包含带有“STU”标签和“图表”按钮的节页脚。

UIView 加载时,以及直到与tableView 的任何交互,MainView's 维度是:

帧:0.000000x、0.000000y、568.000000w、268.000000h

我设置了一个委托协议,这样点击tableView 中的图表按钮将在MainView 中创建一个新视图,通过执行以下方法获得阴影效果:

CGRect newFrame = self.view.frame; // self = MainView
newFrame.size.width = 100;
newFrame.size.height = 50;
UIView *backgroundShadowView = [[UIView alloc] initWithFrame:newFrame];
backgroundShadowView.backgroundColor = [UIColor blackColor];
// Do Animation

上面的重要部分是'newFrame'CGRect。由于某种原因,在通过点击图表按钮与表格视图交互后,甚至滚动或点击一行后,self.view.frame 突然具有以下尺寸:

帧:0.000000x、52.000000y、568.000000w、268.000000h

因此阴影视图如下所示,y 原点比预期开始的位置要低得多,就在渐变条的上方。

我已经为这个问题调整了“shadowview”的宽度和高度;通常它是 568x268,但由于这个问题,屏幕底部会延伸 52 个单位。

52 个单位正好是状态栏 (20) + navigationbar_in_landscape (32) 的高度。

当然我可以手动调整框架尺寸,但我不想这样做。我想知道为什么视图的框架会发生意外变化。

对于我的一生,我无法弄清楚为什么视图会突然偏移。任何帮助表示赞赏!

【问题讨论】:

可能与自动布局有关... 【参考方案1】:

两个厘米。

(1)

这段代码可能总是错误的:

CGRect newFrame = self.view.frame; // self = MainView
newFrame.size.width = 100;
newFrame.size.height = 50;
UIView *backgroundShadowView = [[UIView alloc] initWithFrame:newFrame];

您肯定希望根据self.view边界定义backgroundShadowView 的框架,而不是像您在此处的第一行中所做的那样。

(2)

self.view.frame 的变化可能是虚幻的。您最初可能是在viewDidLoad 中检查的。但这为时过早;该视图尚未添加到界面中,因此尚未调整其大小以适应周围环境。

【讨论】:

巧合的是,我刚刚发现这篇帖子***.com/a/21793477/2418006 描述的内容大致相同。尽管如此,我还是不太明白 bounds 如何提供任何有用的信息 - bounds 的 x 和 y 原点不会总是为 0,因为它是一个相对于自身的坐标系?这种方法看起来几乎等同于手动将这些值设置为 0,但是使用边界“感觉更好”,因为它是父对象的属性:X 好电话@你的第二条评论,现在看来很明显>。 @OneManBand 你没有显示足够的代码让我确定,这就是为什么我对冲我的答案 - 这取决于你用backgroundShadowView 在做什么。但是,如果您将其设为self.view 的子视图,那我是对的,因为backgroundShadowView.frameself.view.bounds 坐标系中。 这是有道理的。谢谢,马特! @OneManBand 换句话说,您必须永远根据父视图的 frame 设置子视图的框架;你必须总是根据它的superview的bounds来设置它。从这里开始查看我对框架和边界的讨论:apeth.com/iosBook/ch14.html#_frame

以上是关于与嵌入式 UITableView 交互后,为啥我的 UIView 的框架会发生意外变化?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UITableView 不显示数据?

为啥我的单元格在我的 UITableView 中显示为空白?

为啥我的 UITableView 的“点击编辑”功能很慢?

动画正在进行时无法与 UITableView 交互

无法与 UITableView 中的 UISearchBar 交互

为啥 UITableView 不从数组中填充