2016-03-31 20 views
2

以下のコードを使用して、UINavigationController(ビュー、ナビゲーションバーではありません)に背景画像を追加しました。ビューを埋めるように画像を拡大しようとしています。私はユーザーのデバイスと方向を知らない。 (注:背景画像が変わる可能性があるため、デバイスやオリエンテーションに固有のサイズや解像度を作成したくない)。iOSナビゲーションビューの背景画像UIViewContentModeScaleAspectFill not working

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSLog(@"%@", NSStringFromCGRect(self.navigationController.view.frame)); 

    // Set background image 
    NSString *filename = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"assets/images/wallpaper.jpg"]; 
    self.background = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:filename]]; 
    self.background.contentMode = UIViewContentModeScaleAspectFill; 
    self.background.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
    self.background.center = CGPointMake(CGRectGetMidX(self.navigationController.view.frame), CGRectGetMidY(self.navigationController.view.frame)); 
    [self.navigationController.view insertSubview:self.background atIndex:0]; 
} 

UIViewContentModeScaleAspectFill及びUIViewAutoresizingFlexibleHeight /幅に関係なく、画面サイズと向きの画面いっぱいに画像スケールを作ることになっています。しかし、私はシミュレータに関する問題について助けが必要です。iOSは、シミュレータがポートレート/ランドスケープモードで起動されているかどうかによって動作が異なります。

以下の画像は、アプリをポートレートモードで起動してから、横向きに回転させるとどうなるかを示しています。肖像画では、画像はビューを満たすように拡大/縮小されません(画像の上下に黒いバーがあります)。ランドスケープでは、画像はビューを満たすために正しくスケーリングされます。

image1

下の画像は、アプリは風景の中に開始し、その後、肖像画に回転させたときに何が起こるかを示しています。ランドスケープでは、画像はビューを満たすように拡大/縮小されません(画像の両側に黒いバーがあります)。ポートレートでは、画像はビューを満たすように正しくスケーリングされます。

image2

なぜiOSが処理しているこれら二つのシナリオの異なった、なぜ画像がビューを埋めるために、正しくスケーリングされていないとどのように私はUIViewContentModeScaleAspectFillが正常に動作するのですか?

+1

あなたは 'UIImageView'の最初の' frame'を設定していません。 'self.background.frame = self.navigationController.view.bounds; 'のようなものを試してみてください。 –

+0

viewDidLayoutSubviewsメソッドで設定されたフレームを忘れないでください。 –

+0

トムは、そのトリックをしました。私は手動でフレームを設定する必要はないと仮定しました。これは、insertSubview:self.background中に自動的に発生するはずです。 – cridgit

答えて

1

答えとして私のコメントを再投稿すると、あなたはこの問題を解決済みとすることができます。

UIImageViewさんの最初のframeを設定していません。何かを試してみる

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    ... 

    self.background.frame = self.navigationController.view.bounds; 
    [self.navigationController.view insertSubview:self.background atIndex:0]; 
}