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

时间:2014-03-18 19:05:52

标签: ios objective-c uiview runtime frame

我正在尝试更新包含内部按钮和标签的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];
}

5 个答案:

答案 0 :(得分:16)

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

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

    // Now modify bottomView's frame here
}

在斯威夫特:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

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

    // Now modify bottomView's frame here
}

答案 1 :(得分:5)

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

答案 2 :(得分:2)

从xib文件或情节提要中设置AutoLayout NO。

答案 3 :(得分:0)

信不信由你,以下代码已将其修复

override func viewDidLayoutSubviews() {
    DispatchQueue.main.async {
        // UI changes
    }
}

答案 4 :(得分:0)

框架设置应在您的代码中起作用。但是,如果视图具有自动布局约束(我假设您已经拥有),则框架设置将无法使用。您只能选择一种方式或另一种方式(手动框架设置或自动布局),不能同时使用两种方式。