Ios 为什么我的UIView';与嵌入式UITableView交互后,是否发生意外的帧更改?

Ios 为什么我的UIView';与嵌入式UITableView交互后,是否发生意外的帧更改?,ios,objective-c,uiview,Ios,Objective C,Uiview,考虑以下UIView“MainView”: 该视图包括一个容器视图,而容器视图又包含一个UITableView控制器。容器视图的y坐标从渐变条的正下方开始。UITableView包括最底部的部分页脚,带有“STU”标签和“图表”按钮 加载UIView时,直到与tableView进行任何交互,MainView的维度为: 帧:0.000000x,0.000000y,568.000000w,268.000000h 我设置了代理协议,点击tableView中的图表按钮将在MainView中创建一个新视

考虑以下
UIView
“MainView”:

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

加载
UIView
时,直到与
tableView
进行任何交互,
MainView的
维度为:

帧: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原点远低于预期的起点,就在渐变条上方

我已经为这个问题调整了“阴影视图”的宽度和高度;通常为568x268,但由于此问题,底部屏幕外会扩展52个单位

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

当然,我可以手动调整框架尺寸,但我不想。我想知道为什么视图的帧会意外更改

就我的一生而言,我无法理解为什么视图突然变得偏移。感谢您的帮助

两条评论

(一)

此代码可能总是错误的:

CGRect newFrame = self.view.frame; // self = MainView
newFrame.size.width = 100;
newFrame.size.height = 50;
UIView *backgroundShadowView = [[UIView alloc] initWithFrame:newFrame];
您肯定希望根据
self.view
的边界定义
backgroundShadowView
的框架,而不是像您在第一行中所做的那样定义其框架

(二)


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

可能与自动布局有关……巧合的是,我刚刚发现这篇文章描述了大致相同的内容。尽管如此,我还是不太明白边界是如何提供任何有用的信息的——边界的x和y原点是否总是0,因为它是相对于自身的坐标系?此方法几乎相当于手动将这些值设置为0,但使用边界执行此操作“感觉更好”,因为它是父对象的属性:XGood call@your second comment,现在看起来很明显>@OneManBand您没有显示足够的代码让我确信,这就是为什么我回避了我的答案——这取决于你在用
backgroundShadowView
做什么。但是如果你把它作为
self.view
的子视图,那么我是对的,因为
backgroundShadowView.frame
self.view.bounds
坐标系中。这是有道理的。谢谢你,马特@OneManBand换句话说,决不能根据子视图的帧设置子视图的帧;您必须始终根据其superview的边界进行设置。请参见我对框架和边界的讨论,从这里开始: