2016-01-23 6 views
8

Zwykle używam następującego kodu, aby ustawić zaokrąglone rogi.Jak ustawić UIImageView z zaokrąglonymi rogami dla trybu dopasowania aspektu

imageView.layer.cornerRadius = 10 

Działa, gdy obraz jest ustawiony na Wypełnienie kształtu.

Ale gdy imageView jest ustawiony na tryb Aspect Fit, a proporcje pomiędzy imageView i picture są różne. Efekt zaokrąglenia narożników nie będzie dostępny.

enter image description here

Kolor tła jest ustawiony na zielono pokazując zaokrąglone narożniki.

Czy istnieje sposób na ustawienie "rzeczywistej części obrazu" na zaokrąglone rogi.

Z góry dziękuję za odpowiedzi.

+1

zobacz ten http://stackoverflow.com/a/30747684/3800154 –

+0

lub zmiany rozmiaru widoku obrazu w celu dopasowania – Wain

Odpowiedz

23

Użyj tego rozszerzenia do 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

+0

Dziękujemy za udostępnienie kodu i wynik. – cowbjt

0

Spróbuj to może pomóc:

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

trzeba najpierw ustawić szerokość i wysokość do tej samej wartości. Następnie ustawić właściwości obrazu tak:

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() 
-1

Jest to bardzo proste, aby zaokrąglić widok obrazu tak:

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

Jednak w celu uzyskania widoku obrazu zaokrąglonego ze współczynnikiem obrazu, myślę, że trzeba ustawić widok obrazu dla trybu ScaleAspectFill.

+0

Jego pytanie brzmiało: "Jak ustawić UIImageView z zaokrąglonymi narożnikami dla trybu dopasowania aspektu" nie prosi o skalowanie obrazu – iTarek

3

Swift 3 wersja pomocnej, akceptowanej odpowiedzi jest już dostępna!

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 
     } 
    } 
} 
Powiązane problemy