0

私の見解では、3つのサブビューがあり、次々と続きます

------------
|    V1    |
------------
|    V2    |
------------
|    V3    |
------------

現在、V1 - V3 は、コンテンツに応じて異なる高さ (高さ 0) を持つことができます (希望の高さを計算できます)。

------------
|    V1    |
|    V1    |
|    V1    |
------------
------------
|    V3    |
|    V3    |
------------

私は何時間もIBの制約をいじりましたが、それを正しく理解することができないので、純粋にプログラム的にすることにしましたが、制約に問題があります。

- (void)setupWithContent:(NSDictionary *)content {

    CGFloat width123 = 200.f;

    CGFloat height1 = [content[@"height1"] floatValue];
    CGFloat height2 = [content[@"height2"] floatValue];
    CGFloat height3 = [content[@"height3"] floatValue];

    [self.view addConstraints:...];
    [self.view1 addConstraints:...];
    [self.view2 addConstraints:...];
    [self.view3 addConstraints:...];

}

プログラムの制約を使用してこれを達成する方法 (プログラムの場合、IB で設定する必要があるもの)

4

2 に答える 2

2

ビジュアル フォーマット言語を使用すると、非常に簡単に行うことができます。次に例を示します。

@interface DAViewController ()

@property (strong, nonatomic) UIView *contentView;
@property (strong, nonatomic) UIView *yellowView;
@property (strong, nonatomic) UIView *purpleView;
@property (strong, nonatomic) UIView *brownView;

@end

@implementation DAViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.translatesAutoresizingMaskIntoConstraints = NO;

    self.contentView = [self viewWithColor:[UIColor lightGrayColor]];
    [self.view addSubview:self.contentView];

    self.yellowView = [self viewWithColor:[UIColor yellowColor]];
    [self.contentView addSubview:self.yellowView];

    self.purpleView = [self viewWithColor:[UIColor purpleColor]];
    [self.contentView addSubview:self.purpleView];

    self.brownView = [self viewWithColor:[UIColor brownColor]];
    [self.contentView addSubview:self.brownView];

    NSDictionary *views = @{@"yellowView" : self.yellowView,
                            @"purpleView" : self.purpleView,
                            @"brownView" : self.brownView};

    NSDictionary *metrics = @{@"padding" : @5,
                              @"width123" : @200,
                              @"height1" : @50,
                              @"height2" : @210,
                              @"height3" : @40};

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.contentView
                                                          attribute:NSLayoutAttributeCenterY
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.view
                                                          attribute:NSLayoutAttributeCenterY
                                                         multiplier:1.
                                                           constant:0.]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.contentView
                                                          attribute:NSLayoutAttributeCenterX
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.view
                                                          attribute:NSLayoutAttributeCenterX
                                                         multiplier:1.
                                                           constant:0.]];

    [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-padding-[yellowView(==height1)][purpleView(==height2)][brownView(==height3)]-padding-|" options:0 metrics:metrics views:views]];

    [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-padding-[yellowView(==width123)]-padding-|" options:0 metrics:metrics views:views]];
    [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-padding-[purpleView(==width123)]-padding-|" options:0 metrics:metrics views:views]];
    [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-padding-[brownView(==width123)]-padding-|" options:0 metrics:metrics views:views]];
}

- (UIView *)viewWithColor:(UIColor *)color
{
    UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
    view.translatesAutoresizingMaskIntoConstraints = NO;
    view.backgroundColor = color;

    return view;
}

@end
于 2013-10-10T11:35:25.160 に答える
0

各ビューでintrinsicContentSize関数をオーバーライドして目的のサイズを返し、目的のサイズが変更されたときにビューでinvalidateIntrinsicContentSizeを呼び出すと、IBで定義された制約が希望どおりに機能するはずです。

[UIView embeddedContentSize] のドキュメント

于 2013-10-10T15:17:40.510 に答える