Как установить UIImageView с закругленными углами для режима соответствия аспект

Обычно я использую следующий код для установки закругленных углов.

imageView.layer.cornerRadius = 10

Он работает, если для параметра imageView установлено значение "Аспект заполнения".

Но когда для параметра imageView установлен режим Aspect Fit, а соотношение между изображением и изображением отличается. Эффект закругленных углов не сможет сказать.

введите описание изображения здесь

Цвет фона установлен на зеленый, чтобы показывать закругленные углы.

Есть ли способ установить "реальную часть изображения" в закругленные углы.

Заранее благодарю за ваши ответы.

Ответ 1

Используйте это расширение для UIImageView:

extension UIImageView
{
    func roundCornersForAspectFit(radius: CGFloat)
    {
        if let image = self.image {

            //calculate drawingRect
            let boundsScale = self.bounds.size.width / self.bounds.size.height
            let imageScale = image.size.width / image.size.height

            var drawingRect: CGRect = self.bounds

            if boundsScale > imageScale {
                drawingRect.size.width =  drawingRect.size.height * imageScale
                drawingRect.origin.x = (self.bounds.size.width - drawingRect.size.width) / 2
            } else {
                drawingRect.size.height = drawingRect.size.width / imageScale
                drawingRect.origin.y = (self.bounds.size.height - drawingRect.size.height) / 2
            }
            let path = UIBezierPath(roundedRect: drawingRect, cornerRadius: radius)
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            self.layer.mask = mask
        }
    }
}

Без вызова этой функции

После вызова этого метода расширения

Ответ 2

Swift 3 версия полезного, принятого ответа здесь!

extension UIImageView {
func roundCornersForAspectFit(radius: CGFloat)
{
    if let image = self.image {

        //calculate drawingRect
        let boundsScale = self.bounds.size.width / self.bounds.size.height
        let imageScale = image.size.width / image.size.height

        var drawingRect : CGRect = self.bounds

        if boundsScale > imageScale {
            drawingRect.size.width =  drawingRect.size.height * imageScale
            drawingRect.origin.x = (self.bounds.size.width - drawingRect.size.width) / 2
        }else {
            drawingRect.size.height = drawingRect.size.width / imageScale
            drawingRect.origin.y = (self.bounds.size.height - drawingRect.size.height) / 2
        }
        let path = UIBezierPath(roundedRect: drawingRect, cornerRadius: radius)
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
        }
    }
}

Ответ 3

Попробуйте, это может вам помочь:

import UIKit


class ViewController: UIViewController{

    @IBOutlet weak var myImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        myImageView.contentMode = UIViewContentMode.ScaleAspectFit
        myImageView.clipsToBounds = true
        //myImageView.layer.cornerRadius = 10.0
        myImageView.layer.masksToBounds = true

        let simpleImage = UIImage(named:"ipad5_einladung.jpg")
        let corneredImage = generateRoundCornerImage(simpleImage!, radius: 10)

        //Set cornered Image
        myImageView.image = corneredImage;

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func generateRoundCornerImage(image : UIImage , radius : CGFloat) -> UIImage {

        let imageLayer = CALayer()
        imageLayer.frame = CGRectMake(0, 0, image.size.width, image.size.height)
        imageLayer.contents = image.CGImage
        imageLayer.masksToBounds = true
        imageLayer.cornerRadius = radius

        UIGraphicsBeginImageContext(image.size)
        imageLayer.renderInContext(UIGraphicsGetCurrentContext())
        let roundedImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return roundedImage
    }

}

Ответ 4

Сначала вам нужно установить ширину и высоту того же значения. Затем установите свойства изображения следующим образом:

imgProfile_Pic.layer.cornerRadius = cell.imgProfile_Pic.frame.size.height / 2
imgProfile_Pic.layer.borderWidth = 3.0
imgProfile_Pic.layer.borderColor = UIColor.white.cgColor
imgProfile_Pic.clipsToBounds = true
imgProfile_Pic.layoutIfNeeded()

Ответ 5

Это принятый ответ, преобразованный в Objective-C:

if (self.image) {
    double boundsScale = self.bounds.size.width / self.bounds.size.height;
    double imageScale = self.image.size.width / self.image.size.height;

    CGRect drawingRect = self.bounds;

    if (boundsScale > imageScale) {
        drawingRect.size.width = drawingRect.size.height * imageScale;
        drawingRect.origin.x = (self.bounds.size.width - drawingRect.size.width) / 2;
    }
    else {
        drawingRect.size.height = drawingRect.size.width / imageScale;
        drawingRect.origin.y = (self.bounds.size.height - drawingRect.size.height) / 2;
    }
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:drawingRect cornerRadius:cornerRadius];
    CAShapeLayer *mask = [CAShapeLayer new];
    [mask setPath:path.CGPath];
    [self.layer setMask:mask];
}

Просто поместите это в категорию для UIImageView.

Ответ 6

Swift 5

Принятый ответ, созданный Аруном Амманной, неверен. Мы должны сместить результирующий прямоугольник, используя этот путь, используя радиус:

import UIKit

extension UIImageView {
    func roundCornersForAspectFit(radius: CGFloat) {
        guard let image = image else {
            return
        }
        let boundsScale = bounds.size.width / bounds.size.height
        let imageScale = image.size.width / image.size.height

        var drawingRect = bounds
        let boundHeight = bounds.size.height
        let boundWidth = bounds.size.width

        if boundsScale > imageScale {
            let scaledImageWidth = image.size.width * boundHeight / image.size.height
            drawingRect.size.width = scaledImageWidth - radius * 2.0
            drawingRect.origin.x = boundWidth / 2 - scaledImageWidth / 2 + radius
            drawingRect.size.height = boundHeight - radius * 2.0
            drawingRect.origin.y = radius
        } else {
            let scaledImageHeight = image.size.height * boundWidth / image.size.width
            drawingRect.size.height = scaledImageHeight - radius * 2.0
            drawingRect.origin.y = boundHeight / 2 - scaledImageHeight / 2 + radius
            drawingRect.size.width = boundWidth - radius * 2.0
            drawingRect.origin.x = radius
        }
        let path = UIBezierPath(roundedRect: drawingRect, cornerRadius: radius)
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        layer.mask = mask
    }
}

Ответ 7

Это очень просто, чтобы округлить изображение таким образом:

self.profileImageView?.clipsToBounds = true
self.profileImageView!.layer.cornerRadius = 10
self.profileImageView?.layer.borderWidth = 1.0
self.profileImageView?.contentMode = .ScaleAspectFit

Но для того, чтобы изображение было округлено с соотношением изображений, я думаю, вам нужно установить режим просмотра изображения в режиме ScaleAspectFill.