1

これは非常に単純な (そしておそらくばかげた) 質問ですが、これに対する最もクリーンで最適なアプローチを見つけることができないようです。ボタンは 3 つあり、ポートレート モードでは見栄えがします。次のように autoResizingMasks を追加することで、中央のものを常に中央に配置することもできます。

[self.centerButton setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin];

ただし、左右のボタンを処理する最善の方法がわかりません。以下のスケッチを参照してください。私が必要としているのは、中央と左端/右端の間の中央に配置するために、それらを少しだけシフトすることです。 ここに画像の説明を入力

IBまたは(できれば)コードを使用してこれをかなり簡単に実行できると確信しているため、おそらくばかげた質問で申し訳ありませんが、正しくて最もクリーンなアプローチについて考えてみたかっただけです。前もって感謝します!

編集

いくつかの追加情報、私はiPadで作業しています。下部のボタンは、実際には「buttonPanel」と呼ばれる下部のサブビューに含まれています。

回答の1つのアドバイスに従って、次のコードを追加しました。下記参照。ただし、「制約を同時に満たすことができません」というメッセージしか表示されません。このコードを追加するとエラーが発生し、制約をリストすると、以下のもののみがリストされるため、このビューには他の追加の制約はありません。以下のコードに何か問題がありますか?ここで明らかな何かが欠けているのではないかと心配しています..

- (void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.buttonPanel removeConstraint:conLeft];
    [self.buttonPanel removeConstraint:conRight];

    float paddingPortrait = 20; // pd
    float paddingLandscape = 50; // ld
    float widthOfView = 768;
    float heightOfView = 249;

    float denominatorVal = heightOfView - widthOfView;

    float leftMultiplier = (paddingLandscape - paddingPortrait) / denominatorVal;
    float rightMultiplier = (denominatorVal + paddingPortrait - paddingLandscape) / denominatorVal;
    float leftConstant = paddingPortrait - (widthOfView * leftMultiplier);
    float rightConstant = -leftConstant;

    conLeft = [NSLayoutConstraint constraintWithItem:self.leftButton attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.buttonPanel attribute:NSLayoutAttributeRight multiplier:leftMultiplier constant:leftConstant];
    conRight = [NSLayoutConstraint constraintWithItem:self.rightButton attribute:NSLayoutAttributeTrailing relatedBy:0 toItem:self.buttonPanel attribute:NSLayoutAttributeRight multiplier:rightMultiplier constant:rightConstant];
    [self.buttonPanel addConstraints:@[conRight,conLeft]];
}

そして、スローされるエラーは次のとおりです。

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

  "(NSAutoresizingMaskLayoutConstraint:0x8b36ce0 h=&-& v=&-- H:[UIButton:0x8874200(166)])",
"(NSAutoresizingMaskLayoutConstraint:0x8b38720 h=&-& v=&-- H:[UIImageView:0x8877880(200)])",
"(NSAutoresizingMaskLayoutConstraint:0x8b38640 h=&-& v=&-- UIImageView:0x8877880.midX == 0.165365*UIView:0x8876c00.width)",
"(NSLayoutConstraint:0x8b3a780 UIImageView:0x8877880.leading == 0.127119*UIView:0x8876c00.right - 77.6271)",
"(NSLayoutConstraint:0x8b3a6a0 UIButton:0x8874200.trailing == 0.872881*UIView:0x8876c00.right + 77.6271)",
"(NSAutoresizingMaskLayoutConstraint:0x8b36ca0 h=&-& v=&-- UIButton:0x8874200.midX == 0.848958*UIView:0x8876c00.width)"

)

制約を破って回復を試みます (NSLayoutConstraint:0x8b3a6a0 UIButton:0x8874200.trailing == 0.872881*UIView:0x8876c00.right + 77.6271)

4

3 に答える 3

3

レイアウトの制約を使用している場合は、IB でボタンを設定してからコードで調整することを組み合わせて行うことができます。中央のボタンを中央に配置し、外側の 2 つのボタンを端から標準距離 (20 ポイント) に配置します。左右の制約に IBOutlets を作成し、viewWillLayoutSubviews メソッドで変更します。

 @implementation ViewController {
 IBOutlet NSLayoutConstraint *conLeft;
 IBOutlet NSLayoutConstraint *conRight;
}


- (void)viewWillLayoutSubviews {
    if (self.view.bounds.size.width > self.view.bounds.size.height) {
        conLeft.constant = 50;
        conRight.constant = 50;
    }else{
        conLeft.constant = 20;
        conRight.constant = 20;
    }
}

編集後:

Rob は、constraintWithItem の使用については正しいです。乗数と定数に適切な値を入力すれば、ビューが回転するときに何もする必要がなく、制約システムがそれを処理します。したがって、上で行ったのと同じボタン設定を使用して、代わりに次のようにすることができます。

@implementation ViewController {
    IBOutlet NSLayoutConstraint *conLeft;
    IBOutlet NSLayoutConstraint *conRight;
    IBOutlet UIButton *lButton;
    IBOutlet UIButton *rButton;
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.view removeConstraint:conLeft];
    [self.view removeConstraint:conRight];
    conLeft = [NSLayoutConstraint constraintWithItem:lButton attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeRight multiplier:0.1316 constant:-22.11];
    conRight = [NSLayoutConstraint constraintWithItem:rButton attribute:NSLayoutAttributeTrailing relatedBy:0 toItem:self.view attribute:NSLayoutAttributeRight multiplier:0.8684 constant: 22.11];
    [self.view addConstraints:@[conRight,conLeft]];
}

そこで、IB で作成された左右の制約を削除し (ただし、IB で作成されたものは残します)、コードで再作成します。両方のボタンの配置がビューの右側 (iPhone では 320 の値) を参照していることに注意してください。これにより、乗数と定数を一緒に使用できます (左側の値は 0 になるため、乗数はそこでは役に立ちません)。これらの値がどうあるべきかを理解するには、いくつかの代数と基本的な制約式が必要です。この場合 (iPhone 4")、数式は次のとおりです。

左ボタンの場合: 乗数 = (ld - pd)/228

右ボタンの場合: 乗数 = (228 + pd - ld)/228 (左ボタンの 1 乗数にも等しいことに注意してください)

pd は縦向きの端からの距離です (私の例では 20 または標準)

ld は横向きの端からの距離です (私の例では 50)

定数値は、左ボタンの乗数の値を次の式に代入することで計算できます: 320 * 乗数 + 定数 = pd

于 2013-01-12T21:53:25.583 に答える
1

簡単な方法

これらのボタンを横軸に自由に配置できます。この場合、右/左ボタンと適切なビューの境界線の間には、縦方向よりも横方向の方が少し多くのスペースがあります。

ここに画像の説明を入力

(2 番目のパス) iOS6 の方法:

iOS6 では、自動レイアウトと制約を使用できます。とても便利です。そして、あなたはそれであなたが望むすべてを行うことができます.

それに関する多くのチュートリアルがあります。問題を正確に見つけようとしましたが、失敗しました。ここでオートレイアウトに触れました。

于 2013-01-12T21:46:28.050 に答える
0

他の 2 つのボタンにも自動サイズ変更マスクを使用します。左下の円については、フレキシブルな上とフレキシブルな右に設定します。右下の円には、柔軟な上と柔軟な左を使用します。

編集-外側のマージンを横向きに少し作りたいと思われることに気づきました。私の解決策はそれをしません。実際、基本的な自動サイズ変更マスクはそのケースを処理できません。

おそらく最善のviewWillLayoutSubviews方法は、View Controller のメソッドを実装し、必要に応じて円のビューを手動で設定することです。

于 2013-01-12T21:41:14.603 に答える