2017-12-19 11 views
1

UIImageViewの場合は、アスペクトフィルコンテンツモードを使用しています。それはOKですが、一部の画像では、clipsToBounds = trueを使用したため、上から切り取られます。だからここに私が欲しいものです:私は、たとえば、同時に2つのフィルタ、アクティブにしたい:ここUIImageViewでトップコンテンツモードと組み合わせたアスペクトフィルコンテンツモードを使用できますか?

は、私は、アスペクト塗りつぶしに設定された画像の図である。

image view with the aspect fill content mode

..

image view with the top content mode

だから私はこれらの2つのコンテンツモードをマージしたい:私はcontentMode = .topを使用して設定された画像表示を.AND。出来ますか?前もって感謝します。

+0

は 'マージ' を定義します。 –

+0

ImageViewで両方のコンテンツモードを使いたいということです。出来ますか? –

+0

@ V-Dev。画像の上端または中央の切り抜きのみを達成したいのですか? –

答えて

3

画像の幅を画像の縦横比に保つように、画像のサイズを変更する必要があります。その後、画像ビューのコンテンツモードを.topに設定し、その範囲へのクリッピングを有効にします。

resizeImageは、this answerの改訂版です。

func setImageView() { 
    imageView.contentMode = .top 
    imageView.clipsToBounds = true 
    let image = UIImage(named: "portrait") 
    imageView.image = resizeImage(image, newWidth: imageView.frame.width) 
} 

func resizeImage(_ image: UIImage?, newWidth: CGFloat) -> UIImage? { 
    guard let image = image else { 
     return nil 
    } 

    let scale = newWidth/image.size.width 
    let newHeight = image.size.height * scale 

    let newSize = CGSize(width: newWidth, height: newHeight) 

    UIGraphicsBeginImageContext(newSize) 
    image.draw(in: CGRect(origin: .zero, size: newSize)) 
    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    return newImage 
} 
+0

ありがとう、それは私がほしいと思うほとんど働く。 –

0

これを試してみてください:

imageView.contentMode = UIViewContentModeTop; 
imageView.image = [UIImage imageWithCGImage:image.CGImage scale:image.size.width/imageView.frame.size.width orientation:UIImageOrientationUp]; 
+0

@ the4kman指定の答えと同じ結果を表示します。しかしそれはより短いです。 :) –

+0

はい、同じ結果:) –