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的边界进行设置。请参见我对框架和边界的讨论,从这里开始: