2016-10-19 13 views
1

親ビューの中央にUIImageViewを配置しようとしています。画像は元のアスペクト比を維持しなければならず、親の境界を超えてはいけません。したがって、横の画像は親の幅によって制限され、縦の画像は元の比率を維持しながら必要な垂直スペースを占有する必要があります。AutoLayout:UIImageViewとAspect Fitコンテンツモード

AutoLayoutではかなり単純な作業のようですね。ここに私のセットアップはUIImageViewのためです:

  • 中央垂直親で
  • 中央水平親で
  • imageView.width < = superview.width
  • imageView.height < = superview.height

contentModeからAspect Fitにも設定します。すべては、デバイスの画面よりも小さい小さな画像では本当にうまくいくが、なんらかの理由で私の大きな画像(imageView.backgroundColor = [UIColor greenColor]に注意)のために、UIImageViewは基底のUIImageよりも多くの領域を取る。

enter image description here

なぜこの出来事はありますか?私は自分の制約によってAutoLayoutの専門家ではないと思う。 200x400のような小さい画像を使用すると、UIImageViewは、緑色の余白がなく、画面上で正確に200x400ポイントを取ります。

境界線と丸みのある角を追加したいと思いますが、この場合は正しく動作しません。

答えて

1

これは、幅と高さの制限を< =と設定しているためです。 小さな画像の場合、imageViewのフレームは問題なく計算され、すべての制約が満たされます。しかし、大きな画像が設定されている場合、画像が収まるようにimageViewのサイズが設定されますが、同じようにsuperview(画面サイズ)のサイズによって制限されます。

  • アスペクト比がわかっている場合は、制約として設定して 緑色の背景は表示されません。
  • それ以外の場合は、そのまま のままにして、背景色をクリアするように設定してください。この の方法では、空いているゾーンは透明になり、 に設定した画像は少なくとも1次元で最大のスペースをとります。

編集:おそらく

ない最善の解決策、オールドスクールの一種。あなたは厳格な幅と高さ制約を追加し、画像のアスペクト比を使用して手動で計算することができます。

@IBOutlet weak var heightConstraint: NSLayoutConstraint! 
@IBOutlet weak var widthConstraint: NSLayoutConstraint! 

func setImage(image: UIImage) { 
    imageView.image = image 
    let screenSize = UIScreen.main.bounds.size 

    let imageAspectRatio = image.size.width/image.size.height 
    let screenAspectRatio = screenSize.width/screenSize.height 

    if imageAspectRatio > screenAspectRatio { 
     widthConstraint.constant = min(image.size.width, screenSize.width) 
     heightConstraint.constant = widthConstraint.constant/imageAspectRatio 
    } 
    else { 
     heightConstraint.constant = min(image.size.height, screenSize.height) 
     widthConstraint.constant = heightConstraint.constant * imageAspectRatio 
    } 
    view.layoutIfNeeded() 
} 
+0

私はこのビューで異なる画像を表示する必要があるので、私は事前に、残念ながらアスペクト比を知らない:大、小、風景、ポートレート、あるいは広場。スクリーンショットからの画像は、3264x2448解像度を有しており、実際には適切に縮小されている:それは、その比率を維持し、それが切り捨てられないか、またはdisstorsed.Butは、残念ながら画像ビューは、画像そのものよりも物理的な空間を取ります。テスト目的のためだけに緑の背景が追加されました。私は角丸を追加する必要がなく、画像ビューのエッジが画像と同期していないため、これらのコーナーは表示されませんので、透明な背景が動作しません。 – fraggjkee

+0

しかし、私は私もプログラムで対応するアスペクト比の制約を追加してみてくださいすることができると思う...ので、この質問のアイデアは、それが達成可能であるかどうかを理解することでした計画のような音:)しかし、すべて実際に私は計算することができますし、自動レイアウトすることなく、プログラム的にすべてを設定Swift/Objective-Cコードを書くことなく。 – fraggjkee

+0

@fraggjkee:あなたの計画が失敗した場合は[OK]を、しかし、ちょうど更新の回答から、私の関数を使用します。私は大きくて小さく、肖像画と風景の画像でそれをテストしたが、期待どおりに動作するようだ。 – alexburtnik

0

は「境界にクリップ」をチェックしてみImageViewのためにInterface Builderで はClip to Bounds Image View

、あなたがよく持っている必要があります-defined高さと幅ではなく、「< =」

関連する問題