void applyBackgroundImageConstraints()

in source/ios/AdaptiveCards/AdaptiveCards/AdaptiveCards/UtiliOS.mm [224:356]


void applyBackgroundImageConstraints(const BackgroundImage *backgroundImageProperties,
                                     UIImageView *imageView, UIImage *image)
{
    if (backgroundImageProperties == nullptr || imageView == nullptr || image == nullptr) {
        return;
    }

    UIView *superView = [imageView superview];
    if (superView == nullptr) {
        return;
    }

    UIView *backgroundView = nil;
    if ([superView isKindOfClass:[ACRContentStackView class]]) {
        backgroundView = ((ACRContentStackView *)superView).backgroundView;
        if (backgroundView) {
            [imageView removeFromSuperview];
            [backgroundView addSubview:imageView];
        }
    }

    UIView *targetView = backgroundView ? backgroundView : superView;

    NSMutableArray<NSLayoutConstraint *> *constraints = [[NSMutableArray alloc] init];
    switch (backgroundImageProperties->GetFillMode()) {
        case ImageFillMode::Repeat: {
            [constraints addObjectsFromArray:@[
                [NSLayoutConstraint constraintWithItem:imageView
                                             attribute:NSLayoutAttributeTop
                                             relatedBy:NSLayoutRelationEqual
                                                toItem:targetView
                                             attribute:NSLayoutAttributeTop
                                            multiplier:1.0
                                              constant:0],
                [NSLayoutConstraint constraintWithItem:imageView
                                             attribute:NSLayoutAttributeBottom
                                             relatedBy:NSLayoutRelationEqual
                                                toItem:targetView
                                             attribute:NSLayoutAttributeBottom
                                            multiplier:1.0
                                              constant:0],
                [NSLayoutConstraint constraintWithItem:imageView
                                             attribute:NSLayoutAttributeLeading
                                             relatedBy:NSLayoutRelationEqual
                                                toItem:targetView
                                             attribute:NSLayoutAttributeLeading
                                            multiplier:1.0
                                              constant:0],
                [NSLayoutConstraint constraintWithItem:imageView
                                             attribute:NSLayoutAttributeTrailing
                                             relatedBy:NSLayoutRelationEqual
                                                toItem:targetView
                                             attribute:NSLayoutAttributeTrailing
                                            multiplier:1.0
                                              constant:0]
            ]];

            imageView.contentMode = UIViewContentModeScaleAspectFill;
            break;
        }
        case ImageFillMode::RepeatHorizontally: {
            [constraints addObjectsFromArray:@[
                [NSLayoutConstraint constraintWithItem:imageView
                                             attribute:NSLayoutAttributeHeight
                                             relatedBy:NSLayoutRelationEqual
                                                toItem:nil
                                             attribute:NSLayoutAttributeNotAnAttribute
                                            multiplier:1.0
                                              constant:image.size.height],
                [NSLayoutConstraint constraintWithItem:imageView
                                             attribute:NSLayoutAttributeLeading
                                             relatedBy:NSLayoutRelationEqual
                                                toItem:targetView
                                             attribute:NSLayoutAttributeLeading
                                            multiplier:1.0
                                              constant:0],
                [NSLayoutConstraint constraintWithItem:imageView
                                             attribute:NSLayoutAttributeTrailing
                                             relatedBy:NSLayoutRelationEqual
                                                toItem:targetView
                                             attribute:NSLayoutAttributeTrailing
                                            multiplier:1.0
                                              constant:0]
            ]];

            configVerticalAlignmentConstraintsForBackgroundImageView(backgroundImageProperties, superView, imageView, constraints);
            break;
        }
        case ImageFillMode::RepeatVertically: {
            [constraints addObjectsFromArray:@[
                [NSLayoutConstraint constraintWithItem:imageView
                                             attribute:NSLayoutAttributeWidth
                                             relatedBy:NSLayoutRelationEqual
                                                toItem:nil
                                             attribute:NSLayoutAttributeNotAnAttribute
                                            multiplier:1.0
                                              constant:image.size.width],
                [NSLayoutConstraint constraintWithItem:imageView
                                             attribute:NSLayoutAttributeTop
                                             relatedBy:NSLayoutRelationEqual
                                                toItem:targetView
                                             attribute:NSLayoutAttributeTop
                                            multiplier:1.0
                                              constant:0],
                [NSLayoutConstraint constraintWithItem:imageView
                                             attribute:NSLayoutAttributeBottom
                                             relatedBy:NSLayoutRelationEqual
                                                toItem:targetView
                                             attribute:NSLayoutAttributeBottom
                                            multiplier:1.0
                                              constant:0]
            ]];
            configHorizontalAlignmentConstraintsForBackgroundImageView(backgroundImageProperties, targetView, imageView, constraints);
            break;
        }
        case ImageFillMode::Cover:
        default: {
            // we should not apply the constraints if the superView's frame is not ready
            // check layoutSubview of ACRContentStackView to see the alternate case
            if (superView.frame.size.width != 0 && superView.frame.size.height != 0) {
                renderBackgroundCoverMode(imageView, targetView, constraints, (ACRContentStackView *)superView);
            }

            configVerticalAlignmentConstraintsForBackgroundImageView(backgroundImageProperties, targetView, imageView, constraints);

            configHorizontalAlignmentConstraintsForBackgroundImageView(backgroundImageProperties, targetView, imageView, constraints);

            targetView.clipsToBounds = YES;
            break;
        }
    }
    [NSLayoutConstraint activateConstraints:constraints];
}