2009-12-10 6 views
52

Je veux faire un UIView ou UIImageView qui est un cercle. Ou un cercle que je peux changer la taille de l'aide d'un curseur, et la couleur de avec un aperçu.Comment faire un UIView circulaire

+0

Ce QA est *** *** OLD INCROYABLE. Sachez que ces jours-ci vous utilisez très simplement "@IBDesignable" et c'est trivial. Prendre plaisir! – Fattie

+0

@JoeBlow sauf si je l'ai manqué, je ne vois pas de "@IBDesignable" ** Réponse ** ici. Pouvez-vous ajouter le vôtre? – pkamb

Répondre

103

Je peux au moins vous montrer un raccourci pour dessiner des cercles de taille arbitraire. Pas d'OpenGL, pas de dessin de Core Graphics nécessaire.

Importez l'infrastructure QuartzCore pour accéder à la propriété .cornerRadius de votre UIView ou UIImageView.

#import <QuartzCore/QuartzCore.h> 

Ajoutez-le également manuellement au dossier Frameworks de votre projet.

Ajouter cette méthode à votre contrôleur de vue ou partout où vous en avez besoin:

-(void)setRoundedView:(UIImageView *)roundedView toDiameter:(float)newSize; 
{ 
    CGPoint saveCenter = roundedView.center; 
    CGRect newFrame = CGRectMake(roundedView.frame.origin.x, roundedView.frame.origin.y, newSize, newSize); 
    roundedView.frame = newFrame; 
    roundedView.layer.cornerRadius = newSize/2.0; 
    roundedView.center = saveCenter; 
} 

Pour l'utiliser, il suffit de passer un UIImageView et un diamètre. Cet exemple suppose que vous avez ajouté un UIImageView nommé "circ" en tant que sous-vue à votre vue . Il devrait avoir un backgroundColor ensemble afin que vous puissiez le voir.

circ.clipsToBounds = YES; 
[self setRoundedView:circ toDiameter:100.0]; 

Ce juste poignées UIImageViews mais vous pouvez généraliser à toute UIView.

REMARQUE: Depuis iOS 7, clipToBounds doit être défini sur OUI.

+0

hey @ willc2 ça ne marche pas pour moi. J'ai créé une tableViewCell personnalisée et ai ajouté 4 imagesView à la cellule. et utilisez votre méthode dans cellForRowAtIndexPath, mais cela ne change que la taille de l'image. Je ne peux pas voir les coins arrondis, qu'est-ce que je fais de mal? – Bonnie

+0

@BOnnie Vous devriez poster comme une nouvelle question. Cela vous donnera l'espace pour décrire votre installation et beaucoup plus de gens seront en mesure de le voir. – willc2

+11

@Bonnie: Je sais que c'est vieux, mais juste pour quelqu'un d'autre qui vient à travers cela, vous devrez définir roundedView.clipsToBounds = YES; – akdsouza

3

Vous devez créer un UIView transparent (couleur d'arrière-plan alpha de 0), puis, dans son drawRect :, dessiner votre cercle en utilisant les appels CoreGraphics. Vous pouvez également modifier le calque de la vue et lui donner un angleRadius.

12

Pas besoin d'appels graphiques. Il suffit de définir le rayon d'angle à la largeur/2. Cela peut être fait sur un objet visuel-à-dire UI élément

30
// For those looking to round the corners of an image view 
imageView.layer.cornerRadius = imageView.bounds.size.width/2; 
imageView.layer.masksToBounds = YES; 
19

Si quelqu'un recherche équivalent Swift que ci-dessous est la réponse (Xcode7.2):

(pour que cela fonctionne hauteur et la largeur doit être égale.)

extension UIView { 
    func makeCircular() { 
     self.layer.cornerRadius = min(self.frame.size.height, self.frame.size.width)/2.0 
     self.clipsToBounds = true 
    } 
} 

enter image description here

+0

Quel est l'objectif de ce code? Je pense que c'est inutile !! 'let cntr: CGPoint = self.center self.center = cntr' –

+0

@Joe Blow personnellement je ne préfère pas storyboard ou nib way parce que vous avez besoin de coder en dur la hauteur et la largeur de la vue et besoin de savoir dans avance. Si vous adoptez et mettez à l'échelle la vue avec une taille et une orientation différentes, l'approche d'Interface Builder risque de se casser. –

+1

Salut, ce QA est extrêmement démodé. La seule solution de nos jours est d'utiliser IBDesignable. C'est absolument trivial aujourd'hui. – Fattie

2

Comme mentionné dans certains commentaires, @IBDesignable rend cela beaucoup plus facile maintenant, vous pouvez donc utiliser Interface Builder pour configurer votre UIImageView arrondie.

d'abord créer une classe nommée RoundedImageView.swift et collez ce code pour cela:

import UIKit 

@IBDesignable public class RoundedImageView: UIImageView { 

    override public func layoutSubviews() { 
     super.layoutSubviews() 

     //hard-coded this since it's always round 
     layer.cornerRadius = 0.5 * bounds.size.width 
    } 
} 

Sélectionnez le UIImageView dans InterfaceBuilder et changer la classe de UIImageView à la coutume RoundedImageView:

enter image description here

Set Clip to Bounds à true (ou l'image s'étendra au-delà du cercle):

enter image description here

Il devrait maintenant arrondir lui-même là dans InterfaceBuilder, qui est assez chouette. Assurez-vous de régler la largeur et la hauteur sur les mêmes valeurs ou il sera en forme de zeppelin!

enter image description here

Questions connexes