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];
}