ios - 使 UIImageView 及其 UIImage 按比例缩放而无需额外填充

标签 ios uiimageview rotation uiimage

我有一个包含 UIImageView 的 UIView。 UIImageViews 就像应用程序的品牌 Logo 一样工作。当我旋转设备时,包含的 UIView 会自行调整大小以适应屏幕的横向或纵向比例。

我想要实现的是相应地缩放 UIImageView,同时保持左边距的比例。

这是顶部白色“横幅”的实际代码:

UIView *topBanner = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, height_topBanner)];
[topBanner setAutoresizingMask:(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin)];
[topBanner setBackgroundColor:[UIColor whiteColor]];
topBanner.autoresizesSubviews = YES;

    // the logo
    UIImage *topBanner_logo = [UIImage imageNamed:@"logo.png"];
    float logoAspectRatio = topBanner_logo.size.width/topBanner_logo.size.height;
    topBanner_logoView = [[UIImageView alloc] initWithFrame:CGRectMake(topBanner.frame.size.width/100*3, topBanner.frame.size.height/100*7, (topBanner.frame.size.height/100*86)*logoAspectRatio, topBanner.frame.size.height/100*86)];
    [topBanner_logoView setImage:topBanner_logo];
    topBanner_logoView.backgroundColor = [UIColor blueColor];
    topBanner_logoView.contentMode = UIViewContentModeScaleAspectFit;
    [topBanner_logoView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleRightMargin)];
    [topBanner addSubview:topBanner_logoView];

[self.view addSubview:topBanner];

这是我的出发点:启动时纵向 iPad:

Startup in portrait mode

这是我在横向旋转它时发生的情况: Landscape mode after the startup

如您所见,UIImage 的比例没问题,但我得到了额外的边框(我设置了 UIImageView 的背景颜色以突出显示它),因为 UIImageView 会拉伸(stretch)自身以跟随其大小的变化容器,UIImage 适合 UIImageView 并放在它的中心。

当我直接以横向模式启动应用程序时,同样的情况发生了——相反的情况: Startup in landscape mode

然后我旋转它:

portrait mode after startup

...我得到了顶部和底部带有额外边框的 Logo 。

我确实看到我可以编写一个函数来重新计算每次旋转更改时的每个大小,但我问自己是否有办法设置 UIImageView 和 UIImage 以使其在不破坏自动旋转/调整大小的情况下工作iOS的程序。听起来很简单!

最佳答案

您可以通过不使用 UIViewContentModeScaleAspectFit 来解决这个问题,而是计算图像的纵横比,并根据另一个(宽度或高度)使用它来明确显示宽度或高度。

例如我旋转到横向,所以我希望高度为 View 的 80%。

    CGFloat w = logo.image.size.width;
    CGFloat h = logo.image.size.height;
    CGFloat a = w / h;

    CGFloat h_use = self.view.height *0.8;
    CGFloat w_use = h_use*a;

此外,将内容模式设置为 UIViewContentModeScaleAspectFill 而不是现在您已经明确设置了纵横比。

关于ios - 使 UIImageView 及其 UIImage 按比例缩放而无需额外填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12899011/

相关文章:

iphone - 核心数据获取结果顺序

ios - SWIFT 删除 subview

ios - 如何将 imageView 中的图像保存到照片库?

ios - SKPhysicsJoint 使旋转无法正常工作

ios - 在 Siesta 中覆盖本地数据?

ios - iOS 开发

ios - 如何控制两个 UIImage 的无动画之间的淡入淡出?

ios - 如何以正确的方向保存视频?

c++ - Opengl 使用鼠标旋转对象 (C++)

ios - UIDatePicker setEnabled 只能在主线程中使用