自动调整 UIImageView 的大小以适合底层图像

Posted

技术标签:

【中文标题】自动调整 UIImageView 的大小以适合底层图像【英文标题】:Auto resizing UIImageView to fit underlying image 【发布时间】:2014-12-24 15:51:47 【问题描述】:

我在 xib 文件中定义了一个自定义视图,其中有一个 UIImageView。

图像以编程方式添加。我在编译时不知道确切的图像大小。

imageView 的高度在设计上是恒定的,而宽度必须是动态的。

UIImageView 应该在设置后自动调整大小以适应图像,但它不会。

我试过了:

在 UI 设计器中设置“Intristic size = Placeholder”。 设置不同的模式,如“Aspect fit”或“Aspect fill” 设置约束(见截图) 在代码中设置大小(参见代码) 在 Google 和 *** 上搜索并尝试代码示例

没有什么能帮助达到预期的结果。

这是我的代码:

@implementation EVACustomNavBar

-(id)initWithCoder:(NSCoder *)aDecoder

    self = [super initWithCoder:aDecoder];
    if(self)
    
        [[NSBundle mainBundle] loadNibNamed:@"EVACustomNavBar" owner:self options:nil];
        self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.frame.size.width, self.frame.size.height);
        [self addSubview:self.view];
    
    return self;


-(void)setLogo:(UIImage *)logo

    NSLog(NSStringFromCGRect(self.logoView.bounds));
    NSLog(NSStringFromCGSize(logo.size));
    self.logoView.backgroundColor = [UIColor blackColor];
    self.logoView.image = logo;
    CGRect ivFrame = self.logoView.bounds;
    CGFloat aspectRatio = logo.size.width / logo.size.height;
    ivFrame.size.width = ivFrame.size.height * aspectRatio;
    self.logoView.bounds = ivFrame;
    NSLog(NSStringFromCGRect(self.logoView.bounds));


@end

我尝试在 ViewController 文件中的 viewDidLoad 和 viewDidAppear 处调用 setLogo。

我尝试了 logoView.bounds 和 logoView.frame。输出是:

logoView.bounds before setting: 0, 0, 0, 44
logo size: 82, 71
logoView.bounds after setting0, 0, 50.816898, 44

但是我看到了这个:

所以即使设置 UIImageView 的框架也无济于事。

【问题讨论】:

【参考方案1】:

尝试在 IB 中创建宽度约束,而不是设置图像视图的边界或框架,而是将其附加到类中的 IBOutlet 并更新宽度约束。

【讨论】:

以上是关于自动调整 UIImageView 的大小以适合底层图像的主要内容,如果未能解决你的问题,请参考以下文章

如何调整 uiimageview 的大小以仅适合 aspectfill 中的图像?

无法让 UIImageView 调整大小以适应屏幕

UIImageview 在自动布局上调整大小

调整UIImageView的大小以包装“适合方面”的图像

UIImageView 适合自调整大小的 tableview 单元格中的最大宽度

UIImage 调整大小并裁剪以适合