UIViewContentModeScaleAspectFillがクリッピングされない


144

を使用して、いくつかのサムネイル画像を固定サイズ(100x100)で描画しようとしていUIImageViewます。画像ビューのフレームサイズを100x100に設定し、contentModeをに設定しましたUIViewContentModeScaleAspectFill

これにより、設定したサイズで画像が描画され、画像は画像の領域を塗りつぶし、画像ビューに設定したサイズの外側にある画像の部分は切り取られます。ただし、画像は引き続き、設定した100x100サイズよりも大きくまたは小さく描画されます。

をに設定するcontentModeUIviewContentModeScaleToFill、画像は正確に100x100で描画されますが、これらの寸法に合わせて変形されます。アスペクトフィルが期待どおりにクリッピングされない理由はありますか?

これが私のコードです:

_photoView = [[UIImageView alloc] initWithImage:photoImage];
_photoView.contentMode = UIViewContentModeScaleAspectFill;
[self addSubview:_photoView];

CGRect photoFrame = _photoView.frame;
photoFrame.size = CGSizeMake(100, 100);
_photoView.frame = photoFrame;

よりわかりやすくするために、ここに私が見ているもののスクリーンショットがあります。緑の四角は、私が作業しているをUIView含んUIImageViewでいます。背景色を緑に、ビューのフレームを100x100に設定しました。テストとして、UIImageViewsサイズは50x50に設定されています。ご覧のとおり、を使用する...AspectFillと、画像のサイズが50x50にならず、場合によっては、希望する場所からオフセットされます。を使用すると...ScaleToFill、サイズは正しくなりますが、画像がゆがみます。

問題を示すスクリーンショット

回答:


352

クリップを境界に設定してみてください

[_photoview setClipsToBounds:YES];

または、ストーリーボード/ Xibで直接次のことができます。

ここに画像の説明を入力してください


10
それだけでした-ありがとう。(上記のスクリーンショットを追加して、私が見ているものを見やすくするために、他の誰かがこの問題に遭遇した場合の例として追加しました。)
Josh Buhler

3
InterfaceBuilderで、(役に立たない)名前を「Clips subviews」に変更しました(注:この場合、「サブビュー」をclibしていません。名前が間違っています。SELFANDサブビューをクリップしています)
Adam

3
NIBファイルで[サブビューをクリップ]オプションをチェックすると、同じことが行われます。乾杯。
codeburn

しかし、あなたはCALayerのプロパティを使用して影を追加する場合について:(その背後にある別のビューを追加することが私のために理想的ではない
Rambatino

私のように自動レイアウトを使用している場合、別の原因が考えられます。それは、NSLayoutConstraint "UIView-Encapsulated-Layout-Height"がUIImageViewのサイズ制限を壊していることです。
ewiinnnnn 2016年

8

知識を広げたい場合は、iOS UIViewスタックのレンダリング方法に関する非常に優れた記事があります。また、描画パイプライン全体に関するより詳細な記事もあります。

要約すれば:

  1. ラスタライズ -ビューのすべてのコンテンツは、ビューの境界の座標空間でラスタライズ(描画またはオフスクリーンピクセルバッファー)されます。これは、画像データまたはカスタム描画(つまりdrawRect:)である可能性がありますが、サブビューコンテンツです。このラスタライズでは、contentModeプロパティが考慮されます。

    ビューの境界外にあるものはすべて破棄されます。

  2. 構成 -結果はサブビューからスーパービューに合成されます(互いの上に描画されます)。これは、サブビューのフレームプロパティを使用します。

    clipsToBoundsプロパティがYESスーパービューにある場合、境界外のサブビューコンテンツを破棄します。


2

同じ問題があり、「Clip Subviews」をチェックすることで解決しました。

画像はストーリーボードプレビューのすべてのビュー(3.5、4、4.7、5.5、ipad)で正しく表示されていましたが、シミュレータでは表示されていませんでした。

「Clip Subviews」にチェックを入れた後、問題は解決しました。:)


1

Storyboard / Xibで「Clip subviews」を直接チェックすることも私にとってうまくいきました。 ここに画像の説明を入力してください


0

サブビューのサイズが変更されていましたが、これはxibに自動レイアウトが設定されているためであることがわかりました。 ここに画像の説明を入力してください


0

すべてが失敗した場合、

viewDidLayoutSubviewsメソッドで境界にクリップを実行します。

例:

  override func viewDidLayoutSubviews() {

    imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
    imageProfile.clipsToBounds = true
    imageProfile.layer.masksToBounds = true
 }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.