ボタンとラベルが含まれている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];
}
この問題は自動レイアウトに関連していました。ただし、プロジェクトで自動レイアウトを使用しているため、オフにできませんでした。ビューで適切な制約を定義することを解決しました。その後、iPhone 4インチか3.5インチかを確認し、各サイズに自動的に適応するため、フレームの位置を変更する必要はありません。
私も同じ問題を抱えています。ビューのスーパービューのレイアウトを強制すると、次のことがわかりました。
-(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
}
信じられないかもしれませんが、以下のコードで修正されました
override func viewDidLayoutSubviews() {
DispatchQueue.main.async {
// UI changes
}
}
XibファイルまたはストーリーボードからAutoLayoutNOを設定します。
フレーム設定はコードで機能するはずです。ただし、ビューに自動レイアウトの制約がある場合(私はあなたが持っていると思います)、フレーム設定は機能しません。どちらか一方(手動フレーム設定または自動レイアウト)にのみ移動でき、両方に移動することはできません。