50

画面の回転中に停止したいサブビューがあるので、NSLayoutConstraintタイプを設定することにしました。末尾の

スペースからスーパービュー
トップスペースからスーパービュー
ボタンスペースからスーパービュー
UITableViewCellのサブクラスにいます。コードを書きましたが、次のエラーが発生します。

'NSInvalidArgumentException', reason: 'Unable to parse constraint format: 
 self is not a key in the views dictionary. 
 H:[self.arrows]-5-|


CustomCell.mの私のコードは次のとおりです。

 self.arrows = [[Arrows alloc]initWithFrame:CGRectMake(self.contentView.bounds.size.width-30, self.bounds.origin.y+4, 30, self.contentView.bounds.size.height-4)];

 NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(self.arrows, self.contentView);
 NSMutableArray * constraint=[[NSMutableArray alloc]init];
 [constraint addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:  [self.arrows]-5-|" options:0 metrics:nil views:viewsDictionary]];
 [constraint addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-1-[self.arrows]" options:0 metrics:nil views:viewsDictionary]];
 [constraint addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"[V: [self.arrows]-1-|" options:0 metrics:nil views:viewsDictionary]];
 [self.arrows addConstraints:constraint];
4

4 に答える 4

120

自動レイアウトビジュアルフォーマット解析エンジンは.、VFL制約の「」を、を使用しているようなキーではなく、keyPathとして解釈しているようvalueForKeyPath:です。

NSDictionaryOfVariableBindings(...)かっこ内のパラメータをすべて取得し、オブジェクトを値として使用してリテラルキーに変換します(この場合は:) @{"self.arrow" : self.arrow}。VFLの場合、autolayoutは、ビューディクショナリに名前が付けられたキーがあり、そのキーが、selfのサブディクショナリ(またはサブオブジェクト)であると考えています。arrow

@{
   @"self" : @{ @"arrow" : self.arrow }
}

システムがキーを「」として解釈することを文字通り望んでいたときself.arrow

通常、このようなインスタンス変数ゲッターを使用している場合、通常、次のように使用する代わりに、独自の辞書を作成することにNSDictionaryOfVariableBindings(...)なります。

NSDictionary *views = @{ @"arrowView" : self.arrow }

また

NSDictionary *views = NSDictionaryOfVariableBindings(_arrow);

これにより、VFLで自分自身なしでビューを使用できるようになりますが、それでも自分が何について話しているのかがわかります。

NSArray *arrowHorizConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[arrowView]-5-|" options:0 metrics:nil views];

また

NSArray *arrowHorizConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[_arrow]-5-|" options:0 metrics:nil views];

原則として、.システムの混乱やデバッグの悪夢を避けるために、ドット()が含まれる辞書キーを使用しないことを学びました。

于 2012-10-24T17:35:18.903 に答える
7

私の秘訣は、プロパティへの単なる別のポインタであるローカル変数を宣言し、それをに置くことNSDictionaryOfVariableBindingsです。

@interface ViewController ()
@property (strong) UIButton *myButton;
@property (strong) UILabel *myLabel;
@end

...

UIButton *myButtonP = self.myButton;
UILabel *theLabelP = self.myLabel;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(myButtonP, myLabelP);

接尾辞は「Pポインタ」用です。

于 2013-10-07T12:31:38.103 に答える
1

最も簡単な解決策は、独自のクラスの変数のゲッターを回避し、スーパークラスの変数をローカル変数として再定義することです。あなたの例の解決策は

UIView *contentView = self.contentView;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_arrows, contentView);
于 2014-09-09T08:48:32.637 に答える
-1

必要なサブビューをメインビューに追加した後、必ず制約を追加してください。この問題に関する知識を得るには時間がかかりました。

于 2014-06-16T12:03:40.370 に答える