在运行时设置图像时不考虑 UIImageView 的内容模式

UIImageView's contentmode not respected when setting image during runtime

我有一个 UIImageView,全屏显示为 'background'。每当我将 viewdidload 中的图像设置为默认值时,contentMode 就可以正常工作。

但是,当我这样做时:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info  {
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];

    self.pickedPhotoImageView.contentMode = UIViewContentModeScaleAspectFit; // set desired contentMode here
    self.pickedPhotoImageView.clipsToBounds = YES;

    self.pickedPhoto = image;
    [self.pickedPhotoImageView setImage:image];
    [self dismissViewControllerAnimated:YES completion:nil];

}

所有对 contentMode 的尊重都丢失了,拍照时只显示照片的一小部分。 UIImageView 怎么会像那样失去对属性的尊重?

确保 UIImageView 已正确设置约束。使用自动布局,每个视图的大小由视图的 intrinsicContentSize (link) 决定。这意味着当您重置 UIView 子类的内容时(无论是 UILabel 中的文本还是在本例中 UIImageView 中的图像,自动布局将计算新的大小。如果您没有设置适当的约束并将内容大小设置为大于当前框架大小,框架将会变大。

至于为什么即使您设置了 contentModeclipsToBounds 也会发生这种情况,contentMode 似乎是在事后完成的,并且会在高度和宽度(您给它的高度和宽度,或者根据 X 和 Y 的相对约束计算出的高度和宽度)。 clipsToBounds 以相同的方式工作,它会在计算布局后裁剪框架边界之外的任何内容。在这种情况下,布局被计算并被认为比屏幕大,并相应地设置 UIImageView 的框架,这就是为什么你只看到照片的一小部分。

希望解释对您有所帮助!