自動レイアウトを使用して、向きが変わったときにサイズと位置を一致させることができることを知っています。向きが変わるとレイアウトを完全に変えることはできますか?
たとえば、以下の縦向きモードの単純なログイン画面のワイヤーフレームを見てください。
デバイスを回転させると、コントロールを完全に再配置したいと思います。
オートレイアウトを使えば、このようなことができるのでしょうか?そうでない場合、どうすればいいですか?
ありがとうございました。
自動レイアウトを使用して、向きが変わったときにサイズと位置を一致させることができることを知っています。向きが変わるとレイアウトを完全に変えることはできますか?
たとえば、以下の縦向きモードの単純なログイン画面のワイヤーフレームを見てください。
デバイスを回転させると、コントロールを完全に再配置したいと思います。
オートレイアウトを使えば、このようなことができるのでしょうか?そうでない場合、どうすればいいですか?
ありがとうございました。
あなたの場合、すべてのコンポーネントをリフレームする代わりに、次のようにコントロールをグループ化する2つの方法で実現できます..
親ビュー -> ユーザー情報ビュー -> すべてのユーザー情報コントロール..これを行うと、すべてのコントロールではなく、ユーザー情報ビューを再フレーム化する必要があります..
次に、ロゴと会社名だけを再構成する必要があります..コントロールをグループ化すると、合計 3 つのコントロールを再構成する必要があります..
ポートレート用とランドスケープ用の 2 つのビューを作成し、回転を追加および削除するだけです。面倒なコードでフレームを再調整する必要がないため、これが最速の方法です。
上記の希望が役立ちます。
フレームを別の方法で設定することはできません: -
-(void)setFramesForPotrait
{
// set frames here
}
-(void)setFramesForLandscaeMode
{
// set frames here
}
-(bool)shouldAutorotate.....
{
return Yes
}
-()willAutoRotate......
{
if(orientation = uiinterfaceOrientationPotrait)
{
[self setFramesForPotrait];
}
else
{
[self setFramesForLandscape];
}
以下のようなレイアウト制約を使用して実行できます。スケッチがうまく機能しないため、これはうまく機能しません。実際に横長で得られるものと比較して、横長のビューが長すぎます。すべてが収まるようにログイン テキスト フィールドを短くする必要がありますが、これでどのように行われたかがわかります。buttonWidth 制約は、ビューの幅とボタンの幅の間に負の相関関係を持たせる方法を示しています。つまり、ボタンの幅は縦よりも横の方が狭くなります。コードで参照する制約への IBOutlets がいくつかあります。興味があれば説明できますが、ここではここで省略します。
@implementation ViewController {
IBOutlet NSLayoutConstraint *buttonWidth;
IBOutlet NSLayoutConstraint *logoTop;
IBOutlet NSLayoutConstraint *logoAlignToLabel;
IBOutlet NSLayoutConstraint *logoSpaceToLabel;
IBOutlet NSLayoutConstraint *coNameToButtonAlignment;
IBOutlet UIButton *b;
IBOutlet UIImageView *logo;
IBOutlet UILabel *coName;
NSLayoutConstraint *con2;
NSArray *cons1;
}
- (void)viewDidLoad {
[super viewDidLoad];
[b removeConstraint:buttonWidth];
buttonWidth = [NSLayoutConstraint constraintWithItem:b attribute:NSLayoutAttributeWidth relatedBy:0 toItem:self.view attribute:NSLayoutAttributeWidth multiplier:-.2193 constant:350];
[self.view addConstraint:buttonWidth];
[self.view layoutSubviews];
}
- (void)updateViewConstraints{
[super updateViewConstraints];
if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)){
if (con2 != nil) {
[self.view removeConstraints:cons1];
[self.view removeConstraint:con2];
[self.view addConstraints:@[logoAlignToLabel,logoSpaceToLabel,logoTop,coNameToButtonAlignment]];
}
}else{
NSLog(@"Landscape");
[self.view removeConstraints:@[logoAlignToLabel,logoSpaceToLabel,logoTop,coNameToButtonAlignment]];
cons1 = [NSLayoutConstraint constraintsWithVisualFormat:@"|-8-[logo]-4-[coName]" options:NSLayoutFormatAlignAllCenterY metrics:0 views:@{@"logo":logo, @"coName":coName}];
con2 = [NSLayoutConstraint constraintWithItem:logo attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];
[self.view addConstraints:cons1];
[self.view addConstraint:con2];
}
}
ローテーションでは、ロゴと社名ラベルの制約が取り除かれ、新しい制約が配置されます。viewDidLoad に設定したボタンの新しい制約は、回転を自動的に処理するため、回転中に調整する必要はまったくありません。
autolayout を使用する場合、updateViewConstraints をオーバーライドして、向きの変更時にレイアウトを変更できます。
- (void)updateViewConstraints{
[super updateViewConstraints];
//portrait
if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)){
}
//landscape
else{
//
}
}