IOS的UIImageView有类似Android的WRAP_CONTENT



这是我的代码

    m_containerbackground = [UIView new];
    m_containerbackground.backgroundColor = [AppleColor clearColor];
    [m_containerbackground setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.view addSubview:m_containerbackground];
    
    [m_containerbackground.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = YES;
    [m_containerbackground.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor].active = YES;
    [m_containerbackground.widthAnchor constraintEqualToConstant:width/pointScale].active = YES;
    [m_containerbackground.heightAnchor constraintEqualToConstant:height/pointScale].active = YES;
    m_container = [UIView new];
    [m_container setTranslatesAutoresizingMaskIntoConstraints:NO];
    [m_containerbackground addSubview:m_container];
    [m_container.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = YES;
    [m_container.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor].active = YES;
    [m_container.widthAnchor constraintEqualToAnchor:m_containerbackground.widthAnchor].active = YES;
    [m_container.heightAnchor constraintEqualToAnchor:m_containerbackground.heightAnchor].active = YES;
    
    m_image = [AppleImageView new];
    [m_image setTranslatesAutoresizingMaskIntoConstraints:NO];
    m_image.image = m_srcImage;
    m_image.contentMode = UIViewContentModeScaleAspectFit;
    [m_container addSubview:m_image];
    [m_image.topAnchor constraintEqualToAnchor:m_container.topAnchor constant:topm].active = YES;
    [m_image.leadingAnchor constraintEqualToAnchor:m_container.leadingAnchor constant:leftm].active = YES;
    [m_image.trailingAnchor constraintEqualToAnchor:m_container.trailingAnchor constant:-rightm].active = YES;
    [m_image sizeToFit];

如上面的代码所示,我能够控制m_image的宽度,并设置UIViewContentModeScaleAspectFit,这是因为我希望m_srcImage的宽度缩放到与m_image相同的宽度,m_srcImage的高度缩放到原始宽高比。然后我想让m_image的高度与缩放后的m_srcImage的高度相同,我该怎么做呢?

下面是我的Android代码,这在Android下工作,因为Android有WRAP_CONTENT和IOS heightAnchor constraintEqualToConstant只能设置特定的值…

m_image = new ImageView(m_activity);
        m_image.setId(m_image.hashCode());
        m_image.setImageBitmap(m_srcImage);
        m_image.setScaleType(ImageView.ScaleType.FIT_START);
        m_image.setAdjustViewBounds(true);
        m_container.addView(m_image);
        {
            ConstraintSet set = new ConstraintSet();
            set.clone(m_container);
            set.constrainHeight(m_image.getId(), ConstraintSet.WRAP_CONTENT);
            set.constrainWidth(m_image.getId(), ConstraintSet.MATCH_CONSTRAINT);
            set.connect(m_image.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP,topm);
            set.connect(m_image.getId(), ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT,rightm);
            set.connect(m_image.getId(), ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT,leftm);
            set.applyTo(m_container);
        }

这里,您需要像这样计算图像高度:

    CGFloat imgWidth = width / pointScale;
    CGFloat imgHeightExpect = m_srcImage.size.height * imgWidth/ m_srcImage.size.width;
    if (m_srcImage.size.width > imgWidth) {
        [m_image.heightAnchor constraintEqualToConstant:imgHeightExpect].active = YES;
    } else {
        [m_image.heightAnchor constraintEqualToConstant:imgHeightExpect].active = NO;
    }

你只需把这段代码添加到你的代码下面。

或者你可以参考这个链接中的其他解决方案:如何在Swift 3中基于UIImage's size/ratio调整UIImageView的大小?