12

UIView をサブクラス化してカスタム groupView を作成し、簡単な方法でレイアウトにいくつかのものを追加しました。この groupView には、見出しとして使用される UILabel と、背景色を持つ CALayer に roundRect を描画する UIView が含まれています。UITableView のセクションを考えてみてください。UIView をドロップし、そのクラスをサブクラスに変更することで、この groupView をストーリーボードに追加します。Xcode でユーザー定義のランタイム属性を使用して見出しを設定しました。ストーリーボードのこのビューに UILabels を追加すると、実行時に見出しラベルと roundrect が作成されます。

私のgroupViewの構造:

  1. groupView: (UIView)clipToBounds:NO;
    • 見出し: (UILabel) groupView の上に配置されます。
    • contentView:(UIView) は、CALayer を介して roundRect と色を作成し、groupView と同じサイズにする必要があります。

だから問題は何ですか?自動レイアウトを扱うのは最初は面倒ですが、このサブクラス化された UIView を機能させるには、contentView の制約をプログラムで設定する必要があります。この自動レイアウト ASCII フォーマット文字列の構文がわかりません。現在私は持っています:

 _contentView = [[UIView alloc]initWithFrame:self.bounds];

    _contentView.layer.cornerRadius = 5.0f;
    _contentView.layer.masksToBounds=YES;
    _contentView.backgroundColor=_backgroundColor;
    _contentView.layer.borderWidth=_borderWidth;
    _contentView.layer.borderColor=_borderColor.CGColor;
    [self insertSubview:_contentView atIndex:0];
    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(self,_contentView);
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"[self]-0-[_contentView]-0-[self]" options:0 metrics:nil views:viewsDictionary];

    for (NSLayoutConstraint *constraint in constraints) {
        [_contentView addConstraint:constraint];
    }

*キャッチされない例外 'NSGenericException' が原因でアプリを終了しています。理由: 'ビューに制約をインストールできません。制約は、ビューのサブツリーの外部から何かを参照していますか? それは違法です。制約: ビュー:>'

私はこれを最初に試しましたが、それでもうまくいきませんでした:

    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_contentView);
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[_contentView]-0-|" options:0 metrics:nil views:viewsDictionary];

*キャッチされない例外 'NSGenericException' が原因でアプリを終了しています。理由: 'ビューに制約をインストールできません。制約は、ビューのサブツリーの外部から何かを参照していますか? それは違法です。制約: ビュー:>'

RANT: どういうわけか、この AutoLayout は私たちの作業を節約すると思われますが、今のところ利点がどのようにオーバーヘッドを上回っているかわかりません。いったいなぜ彼らは、参照やメソッド、さらには型定義を使用することから、この古風なフォーマット文字列に移行したのでしょうか? [_contentView constraint:NSLayoutFormatAlignLeading toView:self withDistance:0.0f]; または似たようなものですか?この時点では、むしろスプリングとストラットを扱いたいと思います。

contentView を self のサイズに制限するための構文を理解したり、表示したりするのに役立ちます。

4

3 に答える 3

29

エラーは、知っておくべきことを示しています。

制約は、ビューのサブツリーの外部から何かを参照していますか?

はい、そうです。スーパービューを参照します。

作成しているこれらの制約は、スーパービュー (この場合はgroupView.

于 2012-11-20T17:13:24.970 に答える
0

| | character はビジュアルフォーマット言語のスーパービューを表すので、次のものが必要だと思います:

@"|-0-[_contentView]-0-|"

そして、関連するすべてのプレーヤーを表示できるビューに制約を追加する必要があるため、contentView ではなく self に制約を追加する必要があります。

ビジュアル言語のリファレンスは次のとおりです: https://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/formatLanguage.html#//apple_ref/doc/uid/TP40010853-CH3- SW1

以下を使用して、ビジュアル形式を完全に回避することもできます。

+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c
于 2013-04-04T21:36:38.660 に答える