3

UIImageViewsを表示するUIScrollViewがあります。ImageViews は、ユーザーが以前に保存した画像の数に基づいて、実行時にプログラムによって挿入されます。以下のエラーが表示されます。

制約を同時に満たすことができません。

おそらく、次のリストの制約の少なくとも 1 つが望ましくないものです。これを試してみてください: (1) 各制約を見て、どれが予期しないものかを把握してみてください。(2) 不要な制約を追加したコードを見つけて修正します。(注: 理解できない NSAutoresizingMaskLayoutConstraints が表示されている場合は、UIView プロパティ translatesAutoresizingMaskIntoConstraints のドキュメントを参照してください)

"<NSLayoutConstraint:0x17029cd90 H:[UIView:0x15cd31e70]-(0)-|   (Names: '|':UIScrollView:0x15cd326b0 )>",
"<NSLayoutConstraint:0x17029d060 UIScrollView:0x15cd326b0.trailingMargin == UIView:0x15cd31e70.trailing>"

スクロールビューが 4 つの側面すべてに 0 ポイントで固定される基本的な Autolayout を実行します。次に、UIScrollView のサブビュー (プレーン UIView) として contentView を追加します。これも 4 辺すべてに 0 ポイントで固定されます。

ストーリーボードの制約の画像を編集

UIScrollview のストーリーボード制約をすべての側でスーパービューに 0 に設定し、子孫の制約を contentView に 0 に設定します。

次のようなコードで contentView に幅を与えます。

    CGSize pagesScrollViewSize = self.scrollView.frame.size;

        NSDictionary *views     = @{ @"contentView"       :   self.contentView};

        NSDictionary *metrics   = @{ @"width"           :   @(pagesScrollViewSize.width * self.mutableArray.count) };

        NSArray *constraints;
        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[contentView(width)]-|" options:0 metrics:metrics views:views];
        [self.scrollView addConstraints:constraints];

[self loadVisiblePages];

UIImageViews は、ViewController へのセグエが発生したときに設定されたページ数に基づいて UIImageViews が追加される場所に追加されます。

-(void)loadVisiblePages{

        CGRect frame = self.scrollView.bounds;
        frame.origin.x = frame.size.width * self.page;
        frame.origin.y = 0.0f;

        ImageForArchiving *newImageObject = (ImageForArchiving*)self.mutableArray[page];
        UIImage *imageForNewPageView = newImageObject.image;

        UIImageView *newPageView = [[UIImageView alloc] initWithFrame:frame];
        [newPageView setTranslatesAutoresizingMaskIntoConstraints:YES];
         newPageView.contentMode = UIViewContentModeScaleAspectFit;
        newPageView.image = imageForNewPageView;
        [self.scrollView addSubview:newPageView];

        [self.pageViews replaceObjectAtIndex:page withObject:newPageView];
    }
}

さらに、UIScrollView をスクロールすると、表示される画像のサイズが回転時に不規則に変化します。これは、上記の警告と、UIImageViews をまだレイアウトしていないという事実の結果に過ぎないと思います。このコンテキストで上記の警告は何を意味し、どのように修正すればよいですか?

4

1 に答える 1

3

scrollViewのtrailingMarginをcontentView.trailingに固定しているようです。この制約の scrollView.Trailing Margin を scrollView.Trailing に変更します。制約を選択した後、ストーリーボードのアクティビティ インスペクターでこれを行うことができます。

または、contentView のすべての制約をクリアします。次に、ピニング制約を再度追加する際にConstrain to margins、すべての定数のチェックを外して 0 に設定します。

コードのこの行を変更します

NSArray *constraints;
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[contentView(width)]-|" options:0 metrics:metrics views:views];
    [self.scrollView addConstraints:constraints];

これとともに:

NSArray *constraints;
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView(width)]|" options:0 metrics:metrics views:views];
    [self.scrollView addConstraints:constraints];

ビジュアル形式で使用@"H:|-[contentView(width)]-|"するということは、contentView を superView の余白に固定し、superView と subView の間に 8 ポイントのスペースを追加することを意味します。ストーリーボードの制約では、UIScrollView のトレーリング エッジとリーディング エッジを使用して制約を設定しましたが、プログラムで追加された制約では、トレーリング マージンとリーディング マージンを使用しました (contentView に 8 ポイントのパディングを維持するように要求するようなものです)。したがって、競合。

ここでビジュアルフォーマットの構文を確認してください。

于 2015-09-24T04:53:14.370 に答える