web-dev-qa-db-ja.com

UIImageViewをロードされた画像のサイズに自動的にサイズ変更する方法

IBを使用してビューにUIImageViewコントロールを配置しました。コントロールのサイズは、私が決めたものにすぎません。実際、かなりランダムなサイズです。imageプロパティを新しいイメージに設定するたびに自動的にサイズを変更するコントロールです。実際に画像のサイズに合わせてサイズを変更したいです。自動的に実行できますか?コードの介入なしで?そうでない場合-この場合の最善のアプローチは何ですか?

今日の出来事は奇妙です。 ImageViewに画像をロードすると、ImageViewのサイズが変更されていなくても、画像が適切に表示されます。これは、ユーザーがImageViewをタッチする意図を妨げます。ユーザーは実際の画像に触れますが、画像の一部がImageViewの外側にあるため(これが奇妙な部分です)、ポイントマッピングがおかしくなります。これについての説明はありますか?

ありがとう

20
Louis Shraga

画像のサイズは、UIImageViewの実際の大きさに関係なく、UIImageViewのサイズは、Interface Builder(またはユーザーが割り当てた)で指定されたサイズのみに依存します。それ以外の場合、たとえばRetinaディスプレイに@ 2x画像を使用すると、画像はすべて奇抜になります。

これを修正する場合は、画像を設定するときにフレームも変更する必要があります。今これをしている場合:

[imageView setImage:[UIImage imageNamed:@"myImage.jpg"]];

次のように変更します。

UIImage img = [UIImage imageNamed:@"myImage.jpg"];
[imageView setImage:img];
imageView.frame = CGRectMake(imageView.frame.Origin.x, imageView.frame.Origin.y,
                             img.size.width, img.size.height);

ただし、これにより、含まれるビューのレイアウトは変更されません。レイアウトの制約を使用して、iOS 6で他のビューのサイズを自動的に変更できます。あなたがApple開発者であれば、WWDCの説明ビデオを見ることができます。彼らはそのシステムが非常にうまく機能する方法を説明しています。

ビューが拡大しないのに問題がなく、問題がそれを含むビューの次元と一致しないものに変更したときに画像がその境界をオーバーフローする方法だけである場合、インターフェイスの[クリップサブビュー]チェックボックスを設定できます。画像ビューのビルダー。これにより、ビューがそれ自身の境界ボックスの外側に何も描画しないようになります。スケーリングモードを「アスペクトフィル」または「スケールトゥフィル」に設定すると、画像は常にビューの境界全体を塗りつぶします。 。

26
Hampus Nilsson

上記のHampus Nilssonと同じ方法を使用して、頻繁にカットアンドペーストするコードスニペットを次に示します。

func demo(x0:CGFloat, y0:CGFloat) {
    let imgView = UIImageView(image: UIImage(named: "someImg.png"));
    imgView.sizeToImage();
    imgView.center = CGPoint(x:x0, y:y0);
}

IImageView Extension

extension UIImageView {

/******************************************************************************/
/** @fcn        sizeToImage()
 *  @brief      size view to image
 *  @@assum     (image!=nil)
 */
/******************************************************************************/
func sizeToImage() {

    //Grab loc
    let xC = self.center.x;
    let yC = self.center.y;

    //Size to fit
    self.frame  = CGRect (x: 0, y: 0, width: (self.image?.size.width)!/2, height: (self.image?.size.height)!/2);

    //Move to loc
    self.center = CGPoint(x:xC, y:yC);

    return;
}

素晴らしいカット&ペースト、必要に応じて使用してください!

1
J-Dizzle