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

nab*_*gir 11 runtime objective-c frame uiview ios

我正在尝试更新UIView其中包含按钮和标签的框架.我想在更新它viewDidLayoutSubviews(我也试过viewDidLoad,viewWillAppear,viewDidAppear...).我想改变视图的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];
}
Run Code Online (Sandbox Code Playgroud)

Lar*_*erg 17

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

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    [self.bottomView.superview setNeedsLayout];
    [self.bottomView.superview layoutIfNeeded];

    // Now modify bottomView's frame here
}
Run Code Online (Sandbox Code Playgroud)

在Swift中:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    bottomView.superview!.setNeedsLayout()
    bottomView.superview!.layoutIfNeeded()

    // Now modify bottomView's frame here
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢拉尔斯,这非常有用!这解决了我在使用一个复杂的自动布局故事板时遇到的问题,即在调用 didLayoutSubviews 时特定视图的大小尚未调整。您的解决方案强制问题视图在 viewDidLayoutSubviews 中正确报告最终大小。 (2认同)

Als*_*ler 6

信不信由你下面的代码修复了它

override func viewDidLayoutSubviews() {
    DispatchQueue.main.async {
        // UI changes
    }
}
Run Code Online (Sandbox Code Playgroud)


nab*_*gir 5

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