web-dev-qa-db-fra.com

Comment définir UIImageView avec des coins arrondis pour le mode d'ajustement d'aspect

J'utilise généralement le code suivant pour définir des coins arrondis.

imageView.layer.cornerRadius = 10

Cela fonctionne lorsque imageView est défini sur Aspect Fill.

Mais lorsque l'imageView est réglé sur le mode Ajuster le format et que le rapport entre imageView et image est différent… .. L'effet coins arrondis ne pourra pas le savoir.

 enter image description here

La couleur d'arrière-plan est définie sur le vert pour afficher les coins arrondis.

Existe-t-il un moyen de définir une "partie d'image réelle" sur des angles arrondis?.

Merci d'avance pour vos réponses.

12
cowbjt

Utilisez cette extension à 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
        }
    }
}

 Without calling this function

 After calling this extension method

30
Arun Ammannaya

Swift 3 version de la réponse utile et acceptée est ici!

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
        }
    }
}
5
amagain

Essayez ceci peut vous aider:

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
    }

}
2
technerd

Vous devez d’abord régler la largeur et la hauteur sur la même valeur. Puis définissez les propriétés de l'image comme suit:

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()
2
Dipak Chhag

C'est la réponse acceptée convertie en 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];
}

Il suffit de mettre cela dans une catégorie pour UIImageView.

0
OffensivelyBad