Je voudrais recréer les boutons circulaires trouvés dans l'application Horloge sous iOS7. Les boutons sont essentiellement des cercles d'apparence différente selon leur état (bordure verte, bordure rouge, remplissage gris).
Je pouvais bien sûr y parvenir en utilisant un simple UIButton avec des images pour les différents états.
Cependant, je cherche une solution qui dessine le cercle par programmation afin de pouvoir facilement changer de rayon, de largeur de trait, etc.
Autant que je sache, UIButton ne me permet que de définir un UIImage pour chaque état. Je ne peux donc pas modifier directement les couches par état (par exemple, fournir une couche avec cornerRadius). Y a-t-il un autre moyen?
La création d'un bouton personnalisé peut être utile.
dans le fichier .h;
#import <UIKit/UIKit.h>
@interface CircleLineButton : UIButton
- (void)drawCircleButton:(UIColor *)color;
@end
dans le fichier .m;
#import "CircleLineButton.h"
@interface CircleLineButton ()
@property (nonatomic, strong) CAShapeLayer *circleLayer;
@property (nonatomic, strong) UIColor *color;
@end
@implementation CircleLineButton
- (void)drawCircleButton:(UIColor *)color
{
self.color = color;
[self setTitleColor:color forState:UIControlStateNormal];
self.circleLayer = [CAShapeLayer layer];
[self.circleLayer setBounds:CGRectMake(0.0f, 0.0f, [self bounds].size.width,
[self bounds].size.height)];
[self.circleLayer setPosition:CGPointMake(CGRectGetMidX([self bounds]),CGRectGetMidY([self bounds]))];
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame))];
[self.circleLayer setPath:[path CGPath]];
[self.circleLayer setStrokeColor:[color CGColor]];
[self.circleLayer setLineWidth:2.0f];
[self.circleLayer setFillColor:[[UIColor clearColor] CGColor]];
[[self layer] addSublayer:self.circleLayer];
}
- (void)setHighlighted:(BOOL)highlighted
{
if (highlighted)
{
self.titleLabel.textColor = [UIColor whiteColor];
[self.circleLayer setFillColor:self.color.CGColor];
}
else
{
[self.circleLayer setFillColor:[UIColor clearColor].CGColor];
self.titleLabel.textColor = self.color;
}
}
@end
Et dans le contrôleur de vue, appelez [self.myCircleButton drawCircleButton:[UIColor myColor]]
Vous pouvez y parvenir de nombreuses façons, par exemple:
Utilisez CAShapedLayer
Sous-classe UIView et utilisez la méthode drawRect: pour dessiner un cercle
Juste un carré UIView et utilisez la propriété layer.cornerRadius
Selon vos besoins, quelque chose d'aussi simple que de créer un UIButton normal et d'appeler
myButton.layer.cornerRadius = myButton.bounds.size.width / 2.0;
pourrait fonctionner (vous devrez inclure le Quartz Framework)
Le modèle que j'ai utilisé pour réaliser ce genre de chose est:
Sous-classe UIButton
et implémentez drawRect
pour dessiner le bouton comme vous le souhaitez, en personnalisant les couleurs en fonction des propriétés selected
et highlighted
du bouton.
Puis remplacez setSelected
et setHighlighted
pour forcer le redessinage de la manière suivante:
-(void)setHighlighted:(BOOL)highlighted {
[super setHighlighted:highlighted];
[self setNeedsDisplay];
}
Solution avec une extension rapide:
extension UIView{
func asCircle(){
self.layer.cornerRadius = self.frame.size.width / 2;
self.layer.masksToBounds = true
}
}
Il suffit d'appeler
myView.asCircle()
Peut fonctionner avec tout type de vue, pas seulement un bouton
Ajouter ce code
imagePreview.layer.cornerRadius = (imagePreview.bounds.size.height/2);
où imagePreview est UIview/UIimageview/UIButton
n'oubliez pas d'ajouter
#import <QuartzCore/QuartzCore.h>
Je pense que ça marche bien.
override func viewDidLoad() {
super.viewDidLoad()
var button = UIButton.buttonWithType(.Custom) as UIButton
button.frame = CGRectMake(160, 100, 50, 50)
button.layer.cornerRadius = 0.5 * button.bounds.size.width
button.setImage(UIImage(named:"thumbsUp.png"), forState: .Normal)
button.addTarget(self, action: "thumbsUpButtonPressed", forControlEvents: .TouchUpInside)
view.addSubview(button)
}
func thumbsUpButtonPressed() {
println("thumbs up button pressed")
}
Vous pouvez utiliser ce contrôle, c'est la sous-classe de UIButton . https://github.com/alvaromb/AMBCircularButton