2012-10-15 85 views
4

我有一个包含UIImageView的UIView。 UIImageViews就像应用程序的品牌徽标一样工作。当我旋转设备时,包含UIView调整自己以对应屏幕的风景或肖像比例。UIImageView和它的UIImage缩放比例没有额外的填充

我想要实现的是让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伸展自身以跟随其容器大小的变化,并且UIImage适合UIImageView并且放在它的中心。

相同的 - 逆转 - 当我在横向模式下直接启动应用情况: Startup in landscape mode

然后转动它:

portrait mode after startup

...和我得到的标志额外边界在顶部和底部。

我确实看到我可以编写一个函数来重新计算每次轮换更改的每个大小,但是我问自己是否有一种方法来设置UIImageView和UIImage使其工作,而不会黑客自动旋转/调整iOS的程序。听起来很简单!

回答

0

您已设置自动调整大小面具灵活的高度和宽度:

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

如果你不这样做,默认是认为不会有机会的大小,因此,图像也不会有的。

+1

但我想要标志按比例调整大小,不想要的行为是UIImageView伸展自己,在两侧创建此“填充”。 – flip79

0

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

尝试topBanner_logoView.contentMode = UIViewContentModeCentertopBanner_logoView.contentMode = UIViewContentModeLeft,以防止调整大小(和得到填充)中的UIImageView的形象。

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

+0

如果我删除调整大小的属性和掩码,徽标将停止自己调整大小,但我的目标是根据其容器的大小相应调整大小。问题是,例如,从纵向到横向会产生这种带状效应,导致徽标在UIImageView内保持居中,而我希望它保持在左侧对齐。 – flip79

+0

你有没有尝试过'[topBanner_logoView sizeToFit];' – yuf

+0

是的,不幸的是,它做了相反的事情:它将UIImageView的大小调整为原始UIImage的大小。 – flip79

0

您可以通过不使用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