2

アプリの設計にアダプティブ レイアウト機能を使用しています。私IBOutletは「アスペクト比」の制約を取ります。この Aspect Ratio Value の値を現在の値の 2 倍に変更したいと考えています。問題は、" constraint" プロパティがコードから簡単に設定できることですが、" multiplier" プロパティは読み取り専用のプロパティです。アスペクト比の変更には、「マルチピア」値の変更が必要です。どうすればこれを行うことができますか?.

@property (retain, nonatomic) IBOutlet NSLayoutConstraint *leftImageWidthAspectRatio;

コード内

NSLog(@"cell.leftImageWidthAspectRatio:%@ : %lf  %lf",cell.leftImageWidthAspectRatio, cell.leftImageWidthAspectRatio.constant,cell.leftImageWidthAspectRatio.multiplier);

その結果

 cell.leftImageWidthAspectRatio:<NSLayoutConstraint:0x7c9f2ed0 UIView:0x7c9f2030.width == 2*RIFeedThumbImageView:0x7c9f2c90.width> : 0.000000  2.000000
4

2 に答える 2

4

その通りです。既存の制約の乗数の変更はサポートされていません。constant例外であり、規則ではありません。ドキュメントから:

他のプロパティとは異なり、定数は制約の作成後に変更できます。既存の制約に定数を設定すると、制約を削除して、定数が異なることを除いて古い制約とまったく同じ新しい制約を追加するよりも、はるかに優れたパフォーマンスが得られます。

あなたがする必要があるのは、そこの最後に記述されていることです:既存の制約を、同一であるが異なる乗数を持つものに置き換えます。このようなものが動作するはずです:

NSLayoutConstraint *oldConstraint = cell.leftImageWidthAspectRatio;
CGFloat newMultiplier = 4; // or whatever
NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:oldConstraint.firstItem attribute:oldConstraint.firstAttribute relatedBy:oldConstraint.relation toItem:oldConstraint.secondItem attribute:oldConstraint.secondAttribute multiplier:newMultiplier constant:oldConstraint.constant];
newConstraint.priority = oldConstraint.priority;
[cell removeConstraint:oldConstraint];
[cell addConstraint:newConstraint];

cellこれは間違った見方である可能性があることに注意してください。IB が元の制約をどこに置くかによって異なります。それがうまくいかない場合は、制約されたビューのスーパービューを掘り下げて (constraintsプロパティでどのような制約があるかを確認できます)、行き着くところを見つけます。

于 2015-06-04T05:16:32.010 に答える
-1

この問題の簡単な解決策、私はそのように見つけました

  1. 幅の別の制約を取る
  2. アスペクト比の優先度を変更します (幅の制約の優先度よりも低い)。
  3. Aspect Ratiomultipileプロパティを使用して幅の制約値を変更します

@property (nonatomic,weak) IBOutlet NSLayoutConstraint *leftImagewidthConstaint;

@property (retain, nonatomic) IBOutlet NSLayoutConstraint *leftImageWidthAspectRatio;

コード内

cell.leftImageWidthAspectRatio.priority=500;
    cell.leftImagewidthConstaint.constant =cell.leftImagewidthConstaint.constant*cell.leftImageWidthAspectRatio.multiplier;

これは正常に動作します

于 2015-06-04T04:59:47.043 に答える