2012-10-15 170 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