为什么在ViewDidLayoutSubviews中没有更新UIView的框架?

我正在尝试更新UIView的框架,其中包含按钮和标签。 我正在尝试在viewDidLayoutSubviews更新它(我也尝试过viewDidLoadviewWillAppearviewDidAppear ..)。 我想更改视图的y位置(origin.y)。 NSLogs说我的原始y位置是334,并且在更改之后,它是100.但是,在我看来,位置不会改变。 我已经检查过故事板中的视图已连接。 我究竟做错了什么?

 -(void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; CGRect theFrame = [self.bottomView frame]; NSLog(@"Y position bottomview: %f", self.bottomView.frame.origin.y); if([[UIScreen mainScreen] bounds].size.height == 568) //iPhone 4inch { // NSLog(@"iphone5"); } else{ // NSLog(@"iphone4"); theFrame .origin.y = 100; } self.bottomView.frame = theFrame; NSLog(@"Y position bottomview after changing it: %f", self.bottomView.frame.origin.y); [self.view layoutIfNeeded]; } 

我遇到了同样的问题。 强制你的视图的超视图布局帮助我:

 -(void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [self.bottomView.superview setNeedsLayout]; [self.bottomView.superview layoutIfNeeded]; // Now modify bottomView's frame here } 

在Swift中:

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() bottomView.superview!.setNeedsLayout() bottomView.superview!.layoutIfNeeded() // Now modify bottomView's frame here } 

这个问题与Autolayout有关。 但是我无法关闭它,因为我在我的项目中使用autolayout。 我解决了在视图中定义适当的约束。 然后无需检查它是iPhone 4英寸还是3.5英寸并更改框架的位置,因为它会自动适应每种尺寸。

从xib文件或故事板中设置AutoLayout NO。