如何使 AutoLayout 适应不断变化的图像尺寸

How to make AutoLayout adjust to changing image sizes

我有一个带有图像视图和两个 UILabel 的 nib 文件,一个在图像上方,一个在图像下方。 nib 用于屏幕上的每个页面,我的视图控制器使用嵌套的 switch 语句来确定用于每个屏幕的图像和文本。我遇到的问题是图像大小不一,有时图像下方的标签不会出现。我希望它总是出现在图像下方 4px 处,所以我设置了一个垂直 space 约束,常数为 4,但是使用日志语句打印 imageview 框架和标签框架的起源和大小告诉我它是被放置在下方超过 4px 的位置,并且可能位于屏幕底部之外。我附上了一些屏幕截图来说明问题。第一个屏幕截图显示所有内容都出现在正确的位置。是否需要在代码中添加一些内容,使标签始终正确显示,而不管图像高度如何?

这是带有约束的 nib 文件的屏幕截图:

这里是设置内容的视图控制器的代码示例:

@implementation ContentViewController

- (id)initForContentSet:(int)setNumber andIndex:(int)indexNumber {
    if (self = [super initWithNibName:@"ContentView" bundle:nil]) {
        self.contentSet = setNumber;
        self.indexNum = indexNumber;
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [_contentImageView setContentMode:UIViewContentModeScaleAspectFit];
    [_contentText setLineBreakMode:NSLineBreakByWordWrapping];
//set up content
switch (_contentSet) {
    case 1:
        switch (_indexNum) {
            case 0:
                //first exposure page
                [_pageHeader setText:@"The Exposure Triangle"];
                [_contentImageView setImage:[UIImage imageNamed:@"exposure-triangle.jpg"]];
                [_contentText setText:@"Balance the amount of available light with aperture, ISO, and shutter speed settings."];
                break;
            case 1:
                //second exposure page
                [_pageHeader setText:@"Example"];
                [_contentImageView setImage:[UIImage imageNamed:@"exposureexample.jpg"]];
                [_contentImageView sizeToFit];
                [_contentText setText:@"An underexposed photo is too dark, while an overexposed one looks washed out."];
                break;
            default:
                break;
        }
        break;

将底部 space 的大小减小到 superview 约束并在设置图像后在 self.view 上调用 updateConstraintsIfNeeded 解决了问题,除了少数UILabel 中包含大量文本的页面。我还必须缩小这些页面上图像的大小才能显示标签。