web-dev-qa-db-de.com

So legen Sie UIImageView mit abgerundeten Ecken für den Seitenanpassungsmodus fest

Normalerweise verwende ich den folgenden Code, um abgerundete Ecken festzulegen.

imageView.layer.cornerRadius = 10

Es funktioniert, wenn imageView auf Aspect Fill eingestellt ist.

Wenn imageView auf Aspect Fit-Modus eingestellt ist und das Verhältnis zwischen imageView und Bild unterschiedlich ist, kann der abgerundete Eckeneffekt nicht erkannt werden.

 enter image description here

Die Hintergrundfarbe ist auf Grün gesetzt, um die abgerundeten Ecken anzuzeigen.

Gibt es eine Möglichkeit, den "echten Bildteil" auf abgerundete Ecken festzulegen.

Vielen Dank im Voraus für Ihre Antworten.

12
cowbjt

Verwenden Sie diese Erweiterung für 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 der hilfreichen, akzeptierten Antwort ist hier vorbei!

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

Versuchen Sie, dies kann Ihnen helfen:

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

Sie müssen zuerst die Breite und Höhe auf denselben Wert einstellen. Stellen Sie dann die Bildeigenschaften wie folgt ein:

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

Dies ist die akzeptierte Antwort, die in Objective-C konvertiert wurde:

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];
}

Geben Sie dies einfach in eine Kategorie für UIImageView ein.

0
OffensivelyBad