web-dev-qa-db-ja.com

UIViewContentModeScaleAspectFit後のサイズ変更された画像の幅を取得します。

私は自分のUIImageViewを持っていて、次のようにサイズ変更する画像をそれに入れました:

UIImageView *attachmentImageNew = [[UIImageView alloc] initWithFrame:CGRectMake(5.5, 6.5, 245, 134)];
attachmentImageNew.image = actualImage;
attachmentImageNew.backgroundColor = [UIColor redColor];
attachmentImageNew.contentMode = UIViewContentModeScaleAspectFit;

これを実行して、UIImageViewのサイズ変更された画像の幅を取得してみました。

NSLog(@"Size of pic is %f", attachmentImageNew.image.size.width);

しかし、実際には元の画像の幅が返されます。画面に表示される画像のフレームを取得するにはどうすればよいですか?

編集:UIImageViewの外観は次のとおりです。赤い領域がbackgroundColorです

enter image description here

26

より明確な解決策があるかどうかはわかりませんが、これでうまくいきます:

float widthRatio = imageView.bounds.size.width / imageView.image.size.width;
float heightRatio = imageView.bounds.size.height / imageView.image.size.height;
float scale = MIN(widthRatio, heightRatio);
float imageWidth = scale * imageView.image.size.width;
float imageHeight = scale * imageView.image.size.height;
45
Mikhail

Swiftのソリューション:

let currentHeight = imageView.bounds.size.height
let currentWidth = imageView.bounds.size.width
let newWidth = UIScreen.mainScreen().bounds.width
let newHeight = (newWidth * currentHeight) / currentWidth

println(newHeight)
1
iagomr

あなたの場合:

float yourScaledImageWitdh =  attachmentImageNew.frame.size.height *  attachmentImageNew.image.size.width / attachmentImageNew.image.size.height
NSLog(@"width of resized pic is %f", yourScaledImageWitdh);

ただし、前に、元の画像の比率とimageViewの比率を確認してください。元の画像の比率がimageViewのフレームの比率よりも広い場合ではなく、赤い領域が水平に追加された場合に備えて、コード行は適切です。

0
meronix

AppleのドキュメントによるとIViewContentModeScaleAspectFit

content(あなたの場合actualImage)をview(あなたの場合attachmentImageNew)のサイズに合わせてスケーリングします。アスペクト比。

つまり、画像サイズ(スケーリング後)はUIImageViewと同じになります。

UPDATE:

UIViewContentModeScaleAspectFitを使用したくない場合、およびscaledImageのサイズを修正できる場合は、以下のコードを使用して画像を拡大縮小し、newSizeを修正できます。コードに幅を使用します。

CGSize newSize = CGSizeMake(100.0,50.0);
UIGraphicsBeginImageContext( newSize );
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
0
Bhavin

Swift 2の場合、このコードスニペットを使用してaspectFitted画像をbottomscreen(この質問に対する以前の回答からのサンプル->皆さん、ありがとうございます)

let screenSize: CGRect = UIScreen.mainScreen().bounds
let screenWidth = CGFloat(screenSize.width)
let screenHeight = CGFloat(screenSize.height)

imageView.frame = CGRectMake(0, screenHeight - (imageView.image?.size.height)! , screenWidth, (imageView.image?.size.height)!)

let newSize:CGSize = getScaledSizeOfImage(imageView.image!, toSize: self.view.frame.size)

imageView.frame = CGRectMake(0, screenHeight - (newSize.height) , screenWidth, newSize.height)

func getScaledSizeOfImage(image: UIImage, toSize: CGSize) -> CGSize       
{
    let widthRatio = toSize.width/image.size.width
    let heightRatio = toSize.height/image.size.height
    let scale = min(widthRatio, heightRatio)
    let imageWidth = scale*image.size.width
    let imageHeight = scale*image.size.height
    return CGSizeMake(imageWidth, imageHeight)
}
0
datayeah

元の画像への参照があるため、常に元の画像と同じ寸法を提供します。

新しい画像のサイズを取得するには、アスペクト比を確認する必要があります。アスペクト比に応じて画像のサイズを変更するプレビューを使用して、さまざまなサイズのさまざまな画像を使用するための式を導き出しました。

0
fibnochi