4

我有一个包含 UIImageView 的 UIView。UIImageViews 的工作方式类似于应用程序的品牌标志。当我旋转设备时,包含的 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 肖像:

纵向模式启动

这就是我在横向旋转它时发生的情况: 启动后的横向模式

如您所见,UIImage 的比例还可以,但是我得到了额外的边框(我设置了 UIImageView 的背景颜色以突出显示它),因为 UIImageView 会随着容器大小的变化而伸展自己,并且UIImage 适合 UIImageView 并放在其中心。

当我直接以横向模式启动应用程序时,也会发生相同的情况 - 反过来: 以横向模式启动

然后我旋转它:

启动后的纵向模式

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

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

4

3 回答 3

1

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

例如,我旋转到横向,所以我希望高度为视图的 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既然您已经明确设置了纵横比,请将内容模式设置为。

于 2014-11-25T03:12:01.687 回答
0

您已将自动调整大小的蒙版设置为灵活的高度和宽度:

[topBanner_logoView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleRightMargin)];

如果您不这样做,则默认情况下视图不会改变大小,因此图像也不会。

于 2012-10-15T16:11:01.180 回答
0

我认为是因为topBanner_logoView.contentMode = UIViewContentModeScaleAspectFit;

尝试topBanner_logoView.contentMode = UIViewContentModeCentertopBanner_logoView.contentMode = UIViewContentModeLeft阻止 UIImageView 的图像调整大小(并获得填充)。

如果 UIImageView 正在调整大小,请移除自动调整大小掩码。

于 2012-10-15T20:53:30.533 回答