2010-12-10 49 views
20

Quelqu'un peut-il m'aider ici? Nouveau en tant que développeur iPhone. J'essaie d'afficher une image .png dans un cercle au lieu d'un rectangle qui est la norme pour l'iPhoneUIImage dans un cercle

+0

http://stackoverflow.com/a/21329347/501487 – aToz

+0

http://stackoverflow.com/questions/7399343/making-a-uiimage-to-a-circle-form/21954535#21954535 –

Répondre

9

Utilisez un UIImageView et définissez le coinRadius à mi-hauteur et largeur. view.layer.cornerRadius = cornerRadius;

UIImage rounded corners

51

Eh bien, tous les fichiers PNG sont les « rectangles », mais si vous voulez avoir le apperence d'un cercle ou un autre objet non rectangle sur l'écran, vous pouvez le faire en utilisant transparacy. Pour vous assurer que les pixels transparents de l'image sont également transparents sur l'iPhone, vous pouvez définir la couleur d'arrière-plan de l'UIImageView à effacer. Cela peut être fait dans Interface Builder en faisant glisser le curseur d'opacité dans le sélecteur de couleur de fond tout en bas, ou dans le code comme suit:

UIImage *image = [UIImage imageNamed:@"yourRoundImage.png"]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
imageView.backgroundColor = [UIColor clearColor]; 
[self.view addSubview: imageView]; 

Si vous voulez simplement ajouter les coins ronds, pour faire un cercle, vous pouvez également utiliser la propriété cette cornerRadius comme si vous avez ajouté le cadre QuartzCore à votre projet:

#import <QuartzCore/QuartzCore.h> 
UIImage *image = [UIImage imageNamed:@"yourRoundImage.png"]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
imageView.layer.cornerRadius = image.size.width/2; 
imageView.layer.masksToBounds = YES; 
[self.view addSubview: imageView]; 
+0

Une solution qui fonctionne bien! Cependant si vous avez beaucoup d'image – Vinzius

+5

La ligne cornerRadius devrait être 'imageView.layer.cornerRadius = imageView.frame.size.width/2;' – guptron

+0

ne fonctionne pas en cas d'ipad –

24

essayer ce code

yourImageView.layer.cornerRadius = yourImageView.frame.size.height /2; 
yourImageView.layer.masksToBounds = YES; 
yourImageView.layer.borderWidth = 0; 

cette image de spectacle comme ios 7 cercle image merci

+0

j'ai essayé cela fonctionne bien merci @waseem – iOSDevp

+0

image merci;) – animaonline

+0

parfait! Merci – malhal

2

Changer le cornerRadius de la vue de l'image fonctionne bien si vous avez seulement quelques images dans votre vue. Cependant, si la vue de l'image est dans une vue de table, les performances seront affectées.

Certaines des autres options:

  1. Faire le cercle actif d'image sur le serveur ou manuellement si elles sont regroupées dans l'application, avec des parties transparentes pour la zone externe du cercle.
  2. Si l'arrière-plan de l'affichage de l'image ne change pas, créez une image de superposition dont la partie du cercle interne est transparente, et le reste doit être identique à l'arrière-plan. Définissez également la propriété backgroundColor de l'affichage de l'image sur clearColor.
  3. Lors de la réception des images, modifiez-les en code pour former un cercle, dans un fil d'arrière-plan.
4

Essayez ceci pour obtenir des coins arrondis de la vue de l'image et aussi pour colorer les coins:

self.imgView.layer.cornerRadius =self.imgView.frame.size.height/2; 
self.imgView.layer.masksToBounds = YES; 
self.imgView.layer.borderColor = [UIColor colorWithRed:148/255. green:79/255. blue:216/255. alpha:1.0].CGColor; 
self.imgView.layer.borderWidth=2; 

Condition *: La hauteur et la largeur de la imageView doit être la même pour obtenir des coins arrondis.

12

Ma contribution avec une extension rapide utilisée pour définir un UIImageView comme cercle

extension UIImageView{ 

    func asCircle(){ 
     self.layer.cornerRadius = self.frame.width/2; 
     self.layer.masksToBounds = true 
    } 

} 

Il suffit d'appeler MyImageView.asCircle()

+2

Oui, j'ai implémenté exactement la même solution dans mon code, sauf que j'ai fait une extension de UIView, car je peux appeler la même méthode même pour d'autres objets (comme des boutons ...). – Andrej

0

Je vais ajouter une extension un peu plus universel à UIImageView qui fonctionnera avec des images non-carrés . A noter que cela fonctionnera plus lentement que la méthode cornerRadius.

extension UIImageView { 
    @IBInspectable public var asEllipse:Bool { 
     get { 
      if let mask = self.layer.mask { 
       return mask.name == kMaskLayerName 
      } 
      return false; 
     } 

     set { 
      if (newValue) { 
       let ellipseMask = CAShapeLayer() 
       ellipseMask.name = kMaskLayerName 
       ellipseMask.path = CGPathCreateWithEllipseInRect(self.bounds, nil) 
       ellipseMask.strokeColor = UIColor.clearColor().CGColor 
       ellipseMask.fillColor = UIColor.whiteColor().CGColor 
       self.layer.mask = ellipseMask 
      } else if self.asEllipse { 
       self.layer.mask = nil 
      } 
     } 
    } 

} 

private let kMaskLayerName="EllipseMaskLayer" 
+0

Pourquoi est-ce plus lent que 'cornerRadius'? –

+0

Je suppose que ce sont les allocations d'objets qui le ralentissent: une CAShapeLayer, une CGPath et deux UIColor. Bien que cela ait été testé pour des images de cellules dans une tableView sur un iPhone 5 et plus, il n'y a pas de ralentissement perceptible lors du défilement. TBH Je n'ai pas fait une bonne recherche d'optimisation dans Instruments. – user3099609

0

Swift 4: Cela devrait afficher votre .png dans un cercle.

  1. Faites glisser (ctrl + clic) une IBOutlet d'une image vers votre code.

enter image description here

cornerRadius Le rayon à utiliser lors de l'élaboration des angles arrondis pour l'arrière-plan de la couche. Animable. https://developer.apple.com/documentation/quartzcore/calayer/1410818-cornerradius

propriété clipsToBounds Valeur booléenne qui détermine si les sous-vues sont limitées aux limites de la vue. https://developer.apple.com/documentation/uikit/uiview/1622415-clipstobounds

2.Inside viewDidLoad(), Utilisez la propriété d'instance layer.cornerRadius et clipsToBounds.

profileImage.layer.cornerRadius = 50 
profileImage.clipsToBounds = true