2016-12-15 13 views
7

重複としてマークしないでください。使用可能なスレッドを考慮したソリューションが見つかりませんでした。SwII 3でUIImageのサイズ/比率に基づいてUIImageViewのサイズを変更するには?

私にはUIImageViewがあります。ユーザーはUIImagesをさまざまな形式でダウンロードできます。問題は、与えられたImageの比率に基づいてサイズを変更するには、UIImageViewが必要だということです。

現在、私はAspect fitを使用していますが、UIImageViewはそれ自体の大きな部分では空のままです。そのコンテンツに基づいてサイズを変更することを希望しています(UIImageView)。例えばPICが1である場合:1、4:3,6:2、16:9 ...

enter image description here

ヘルプが非常に高く評価されています。

要求されたとして、それは私が欲しいものです:

enter image description here

私は16で画像をロードし、四角だったUIImageViewがあった:7または任意のサイズに合わせてサイズ変更UIImageView画像...

+0

「アスペクトの塗りつぶし」はどうですか? – Satachito

+1

写真をカットするので、アスペクトフィルはほとんどオプションではありません... –

+1

あなたの理想的な結果がどのようなものかはっきりしていないので、あなたのアプリがしたいものの写真を投稿してください。 @Yohst、 – Yohst

答えて

9

ここで(申し訳ありませんが、バグの元答えは、私はそれを修正)スウィフトの例である、あなたは画像比率とコンテナビューのサイズに応じてImageViewのサイズを変更したいルックス:

let containerView = UIView(frame: CGRect(x:0,y:0,width:320,height:500)) 
    let imageView = UIImageView() 

    if let image = UIImage(named: "a_image") { 
     let ratio = image.size.width/image.size.height 
     if containerView.frame.width > containerView.frame.height { 
      let newHeight = containerView.frame.width/ratio 
      imageView.frame.size = CGSize(width: containerView.frame.width, height: newHeight) 
     } 
     else{ 
      let newWidth = containerView.frame.height * ratio 
      imageView.frame.size = CGSize(width: newWidth, height: containerView.frame.height) 
     } 
    } 
+0

私はコンテナビューを使用していません。現在、ソリューションのコードを再作成しようとしています。 –

+0

@DavidSeek、containerViewここはデモ用です。それを使用していない場合、コントローラのルートビューはコンテナビューと見なすことができます。 –

+0

@DavidSeek、あなたのスクリーンショットによると、幅は固定されて見えますが、高さは動的です。もしそうなら、次の文を使って高さを取得してください:newHeight = containerView.frame.width/ratioを使って動的な高さを取得してください。 –

0

あなたのimageViewをaspectFitに設定すると、imageViewのフレームを超えないように画像のサイズが変更されます。

あなたのimageViewのサイズはロジックでthis questionから取得できます。基本的にはUIImageの高さと幅を取得するだけです。

比率を計算し、あなたに合うようにimageViewの幅/高さを設定します。

また、similar questionという回答があります。

+0

あなたは間違った方法で質問を持っています。 OPのクォート:UIImageViewの内容に基づいてサイズを変更したいと思っています。これは次のことを意味します:UIImageViewに含まれているUIImageViewのサイズを変更したいとします。彼は 'UIImage'が入っている' UIImageView'で 'UIImage'のサイズを変更したくありません。言い換えれば、 'UIImage'が' UIImageView'のサイズを決めることを望みます。彼は 'UIImageView'が' UIImage'のサイズを決めるのを望んでいません。 – Utku

+0

@UtkuあなたはOPの質問を理解しているかどうかはわかりませんが、基本的には答えのコードにw/oの答えがあるという説を出しました...しかし、もっと簡単な説明が必要な場合は、Imageのアスペクト比を取得し、 'UIImageView 'を同じ比率に変更して、余分なスペースをなくします。 –

4

私はあなたが持っている同じ問題への解決策を見つけようと多くの時間を費やし、これは私のために働いた唯一の解決策(スウィフト4、Xcodeの9.2)である:

class ScaledHeightImageView: UIImageView { 

    override var intrinsicContentSize: CGSize { 

     if let myImage = self.image { 
      let myImageWidth = myImage.size.width 
      let myImageHeight = myImage.size.height 
      let myViewWidth = self.frame.size.width 

      let ratio = myViewWidth/myImageWidth 
      let scaledHeight = myImageHeight * ratio 

      return CGSize(width: myViewWidth, height: scaledHeight) 
     } 

     return CGSize(width: -1.0, height: -1.0) 
    } 

} 

は、プロジェクトとセットにクラスを追加します。 UIImageViewをカスタムクラスScaledHeightImageViewに追加します。イメージビューのコンテンツモードはAspect Fitです。

私の問題は、この記事に記載されているものと同じです。私のプロトタイプTableViewCellのContentViewの中には、各エッジに垂直なStackViewがあります。 StackViewの中には、Label、ImageView、および別のラベルがあります。 ImageViewをAspectFitに設定するだけでは十分ではありませんでした。画像は適切なサイズと比率になりますが、ImageViewは画像とラベルの間に余分なスペースを残して実際の画像をラップしませんでした(上の画像のように)。 ImageViewの高さは、サイズ変更された画像の高さではなく元の画像の高さに一致するように見えました(aspectFitがその仕事をした後)。私が見つけた他の解決策は、さまざまな理由で問題を完全には解決しませんでした。私はこれが誰かを助けることを望む。

+1

このコードは、UIImageViewの幅全体を満たしたWebから読み込まれた画像の高さを調整するのに役立ちました。私はコンテンツモードを** Aspect Fill **(重要)に設定し、** ViewのHeight制約を設定しないで**サイズの底に** Intrinsic size **を** Placeholder **に設定する必要がありました(そして、下のHeightフィールドに値を入力します)。 – javaxian

関連する問題