web-dev-qa-db-ja.com

UIViewのフレームがViewDidLayoutSubviewsで更新されないのはなぜですか?

ボタンとラベルが含まれている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];
}
11
nabrugir

この問題は自動レイアウトに関連していました。ただし、プロジェクトで自動レイアウトを使用しているため、オフにできませんでした。ビューで適切な制約を定義することを解決しました。その後、iPhone 4インチか3.5インチかを確認し、各サイズに自動的に適応するため、フレームの位置を変更する必要はありません。

5
nabrugir

私も同じ問題を抱えています。ビューのスーパービューのレイアウトを強制すると、次のことがわかりました。

-(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
}
17
Lars Blumberg

信じられないかもしれませんが、以下のコードで修正されました

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

XibファイルまたはストーリーボードからAutoLayoutNOを設定します。

2
ayalcin

フレーム設定はコードで機能するはずです。ただし、ビューに自動レイアウトの制約がある場合(私はあなたが持っていると思います)、フレーム設定は機能しません。どちらか一方(手動フレーム設定または自動レイアウト)にのみ移動でき、両方に移動することはできません。

0
Hlung