私は同じ問題を抱えていましたが、以下はそれを機能させるために私がしたことです。
新しい 4 インチ ディスプレイ用にサイズ変更する必要があるいくつかのアプリで使用されている画像があります。ビューの高さを指定せずに、必要に応じて画像のサイズを自動的に変更する以下のコードを作成しました。このコードは、ビュー全体を埋める背景画像のように、特定の画像の高さが NIB で特定のフレームの高さ全体になるようにサイズ設定されていることを前提としています。NIB では、UIImageView をストレッチに設定しないでください。幅は同じままで高さだけが変化するため、イメージを引き伸ばす作業が行われ、イメージが歪んでしまいます。あなたがする必要があるのは、同じデルタで高さと幅を調整してから、同じデルタで画像を左にシフトして中央に戻すことです。これにより、指定されたフレームの高さいっぱいまで拡張しながら、両側が少し切り落とされます。
私はこう呼んでいます…
[self resizeImageView:self.backgroundImageView intoFrame:self.view.frame];
画像がNIBに設定されている場合、通常はviewDidLoadでこれを行います。しかし、実行時にダウンロードされ、そのように表示される画像もあります。これらの画像は EGOCache でキャッシュされるため、キャッシュされた画像を UIImageView に設定した後、または画像をダウンロードして UIImageView に設定した後に resize メソッドを呼び出す必要があります。
以下のコードは、ディスプレイの高さを特に気にしません。実際には、高さの変化が元の高さよりも大きくなるたびに想定して、回転用の画像のサイズ変更を処理するために、実際には任意の表示サイズで動作する可能性があります。より広い幅をサポートするには、このコードもそのシナリオに対応するように調整する必要があります。
- (void)resizeImageView:(UIImageView *)imageView intoFrame:(CGRect)frame {
// resizing is not needed if the height is already the same
if (frame.size.height == imageView.frame.size.height) {
return;
}
CGFloat delta = frame.size.height / imageView.frame.size.height;
CGFloat newWidth = imageView.frame.size.width * delta;
CGFloat newHeight = imageView.frame.size.height * delta;
CGSize newSize = CGSizeMake(newWidth, newHeight);
CGFloat newX = (imageView.frame.size.width - newWidth) / 2; // recenter image with broader width
CGRect imageViewFrame = imageView.frame;
imageViewFrame.size.width = newWidth;
imageViewFrame.size.height = newHeight;
imageViewFrame.origin.x = newX;
imageView.frame = imageViewFrame;
// now resize the image
assert(imageView.image != nil);
imageView.image = [self imageWithImage:imageView.image scaledToSize:newSize];
}
- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}