web-dev-qa-db-fra.com

Donner des coins arrondis à UIView

Ma vue de connexion a une sous-vue qui a une UIActivityView et une UILabel disant "Connexion en cours…". Cette sous-vue comporte des coins non arrondis. Comment puis-je les faire tourner?

Est-il possible de le faire à l'intérieur de mon xib?

535
itsaboutcode

Essaye ça

#import <QuartzCore/QuartzCore.h> // not necessary for 10 years now  :)

...

view.layer.cornerRadius = 5;
view.layer.masksToBounds = true;

Remarque: Si vous essayez d'appliquer des angles arrondis à la vue d'une UIViewController, celle-ci ne doit pas être appliquée dans le constructeur du contrôleur de vue, mais plutôt dans -viewDidLoad, après que view soit réellement instancié.

1171
Ed Marty

Vous pouvez également utiliser le/Attributs d'exécution définis par l'utilisateurdu générateur d'interface pour définir le chemin d'accès à la clé layer.cornerRadius à une valeur. Assurez-vous cependant d'inclure la bibliothèque QuartzCore.

Cette astuce fonctionne également pour configurer layer.borderWidth, mais cela ne fonctionnera pas pour layer.borderColor car cela suppose une CGColor pas une UIColor.

Vous ne pourrez pas voir les effets dans le storyboard car ces paramètres sont évalués au moment de l'exécution. 

Using Interface builder to set the corner radius

252
Gujamin

Vous pouvez maintenant utiliser une catégorie Swift dans UIView (code sous l'image) avec @IBInspectable pour afficher le résultat dans le storyboard (si vous utilisez la catégorie, utilisez uniquement cornerRadius et non layer.cornerRadius comme chemin d'accès clé.

extension UIView {
    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }
}

enter image description here

60

Une approche différente de celle d'Ed Marty:

#import <QuartzCore/QuartzCore.h>

[v.layer setCornerRadius:25.0f];
[v.layer setMasksToBounds:YES];

Vous avez besoin de setMasksToBounds pour qu'il puisse charger tous les objets d'IB ... J'ai un problème qui a rendu mon point de vue arrondi, mais les objets d'IB n'étaient pas disponibles: /

cela a résolu cela = D espérons que cela aide!

43

Rapide

Réponse courte:

myView.layer.cornerRadius = 8
myView.layer.masksToBounds = true  // optional

Réponse supplémentaire

Si vous êtes arrivé à cette réponse, vous en avez probablement déjà vu assez pour résoudre votre problème. J'ajoute cette réponse pour donner une explication un peu plus visuelle de la raison pour laquelle les choses font ce qu'elles font.

Si vous commencez avec une UIView régulière, elle a des coins carrés.

let blueView = UIView()
blueView.frame = CGRect(x: 100, y: 100, width: 100, height: 50)
blueView.backgroundColor = UIColor.blueColor()
view.addSubview(blueView)

enter image description here

Vous pouvez définir des angles arrondis en modifiant la propriété cornerRadius de la layer de la vue. 

blueView.layer.cornerRadius = 8

enter image description here

Les valeurs de rayon plus grandes donnent des angles plus arrondis 

blueView.layer.cornerRadius = 25

enter image description here

et des valeurs plus petites donnent des angles moins arrondis.

blueView.layer.cornerRadius = 3

enter image description here

Cela pourrait suffire à résoudre votre problème ici. Cependant, une vue peut parfois avoir une sous-vue ou une sous-couche qui sort des limites de la vue. Par exemple, si je devais ajouter un subview comme ceci

let mySubView = UIView()
mySubView.frame = CGRect(x: 20, y: 20, width: 100, height: 100)
mySubView.backgroundColor = UIColor.redColor()
blueView.addSubview(mySubView)

ou si je devais ajouter un sublayer comme celui-ci

let mySubLayer = CALayer()
mySubLayer.frame = CGRect(x: 20, y: 20, width: 100, height: 100)
mySubLayer.backgroundColor = UIColor.redColor().CGColor
blueView.layer.addSublayer(mySubLayer)

Alors je finirais avec 

enter image description here

Maintenant, si je ne veux pas de choses suspendues en dehors des limites, je peux le faire

blueView.clipsToBounds = true

ou ca

blueView.layer.masksToBounds = true

ce qui donne ce résultat:

enter image description here

clipsToBounds et masksToBounds sont tous deux équivalent _. C'est juste que le premier est utilisé avec UIView et le second est utilisé avec CALayer

Voir également

42
Suragch

Comme décrit dans cet article de blog , voici une méthode pour arrondir les angles d'un UIView:

+(void)roundView:(UIView *)view onCorner:(UIRectCorner)rectCorner radius:(float)radius
{
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds
                                                   byRoundingCorners:rectCorner
                                                         cornerRadii:CGSizeMake(radius, radius)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = view.bounds;
    maskLayer.path = maskPath.CGPath;
    [view.layer setMask:maskLayer];
    [maskLayer release];
}

La partie intéressante à ce sujet est que vous pouvez sélectionner les coins que vous souhaitez arrondir.

26
pabloruiz55

Vous devez d'abord importer le fichier d'en-tête <QuartzCore/QuartzCore.h>

 #import QuartzCore/QuartzCore.h>

[yourView.layer setCornerRadius:8.0f];
yourView.layer.borderColor = [UIColor redColor].CGColor;
yourView.layer.borderWidth = 2.0f;
[yourView.layer setMasksToBounds:YES];

Ne manquez pas d'utiliser -setMasksToBounds, sinon l'effet risque de ne pas être affiché.

19
Samir Jwarchan

Vous pouvez utiliser la classe UIView personnalisée suivante qui permet également de modifier la couleur et la largeur de la bordure. Comme il s'agit de IBDesignalbe Vous pouvez également modifier les attributs dans le générateur d'interface.

 enter image description here

import UIKit

@IBDesignable public class RoundedView: UIView {

    @IBInspectable var borderColor: UIColor = UIColor.white {
        didSet {
            layer.borderColor = borderColor.cgColor
        }
    }

    @IBInspectable var borderWidth: CGFloat = 2.0 {
        didSet {
            layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet {
            layer.cornerRadius = cornerRadius
        }
    }

}
9
Vakas
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20, 50, 200, 200)];

view.layer.backgroundColor = [UIColor whiteColor].CGColor;
view.layer.cornerRadius = 20.0;
view.layer.frame = CGRectInset(v.layer.frame, 20, 20);

view.layer.shadowOffset = CGSizeMake(1, 0);
view.layer.shadowColor = [[UIColor blackColor] CGColor];
view.layer.shadowRadius = 5;
view.layer.shadowOpacity = .25;

[self.view addSubview:view];
[view release];
6
jorik
view.layer.cornerRadius = 25
view.layer.masksToBounds = true
3
Parth Barot

S'il vous plaît importez Quartzcore framework, vous devez définir setMaskToBounds à TRUE this la ligne très importante.

Alors: [[yourView layer] setCornerRadius:5.0f];

2
DeveshM
UIView* viewWithRoundedCornersSize(float cornerRadius,UIView * original)
{
    // Create a white border with defined width
    original.layer.borderColor = [UIColor yellowColor].CGColor;
    original.layer.borderWidth = 1.5;

    // Set image corner radius
    original.layer.cornerRadius =cornerRadius;

    // To enable corners to be "clipped"
    [original setClipsToBounds:YES];
    return original;
}
2
Ashish Patel

Swift 4 - Utilisation de IBDesignable

   @IBDesignable
    class DesignableView: UIView {
    }

    extension UIView
    {

        @IBInspectable
        var cornerRadius: CGFloat {
            get {
                return layer.cornerRadius
            }
            set {
            layer.cornerRadius = newValue
        }
    }
}
2
Saranjith

Faites-le par programme en obj c

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20, 50,    200, 200)];

view.layer.backgroundColor = [UIColor whiteColor].CGColor;
view.layer.cornerRadius = 20.0;
view.layer.frame = CGRectInset(v.layer.frame, 20, 20);

[view.layer.shadowOffset = CGSizeMake(1, 0);
view.layer.shadowColor = [[UIColor blackColor] CGColor];
view.layer.shadowRadius = 5;
view.layer.shadowOpacity = .25;][1]

[self.view addSubview:view];

Nous pouvons également le faire à partir de stoaryboard.

 layer.cornerRadius  Number  5

 enter image description here

1
Vikas Rajput

si les coins ronds ne fonctionnent pas dans viewDidload () il vaut mieux écrire du code dans viewDidLayoutSubview ()

-(void)viewDidLayoutSubviews
{
    viewTextfield.layer.cornerRadius = 10.0 ;                                               
    viewTextfield.layer.borderWidth = 1.0f;
    viewTextfield.layer.masksToBounds =  YES;
    viewTextfield.layer.shadowRadius = 5;
    viewTextfield.layer.shadowOpacity = 0.3;
    viewTextfield.clipsToBounds = NO;
    viewTextfield.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
}

J'espère que cela t'aides!

1
Dharmesh Mansata

Utiliser l'extension UIView:

extension UIView {    

func addRoundedCornerToView(targetView : UIView?)
{
    //UIView Corner Radius
    targetView!.layer.cornerRadius = 5.0;
    targetView!.layer.masksToBounds = true

    //UIView Set up boarder
    targetView!.layer.borderColor = UIColor.yellowColor().CGColor;
    targetView!.layer.borderWidth = 3.0;

    //UIView Drop shadow
    targetView!.layer.shadowColor = UIColor.darkGrayColor().CGColor;
    targetView!.layer.shadowOffset = CGSizeMake(2.0, 2.0)
    targetView!.layer.shadowOpacity = 1.0
}
}

Usage:

override func viewWillAppear(animated: Bool) {

sampleView.addRoundedCornerToView(statusBarView)

}
0
A.G

set cornerRadious Property pour une vue ronde

set masksToBounds Boolean La valeur pour l'image ne sera pas toujours tracée en dehors de la limite du rayon de l'angle

view.layer.cornerRadius = 5;

view.layer.masksToBounds = YES;
0
bhautikmewada191

Vous pouvez également utiliser une image:

UIImage *maskingImage = [UIImage imageNamed:@"bannerBarBottomMask.png"];
CALayer *maskingLayer = [CALayer layer];
maskingLayer.frame = CGRectMake(-(self.yourView.frame.size.width - self.yourView.frame.size.width) / 2
                                , 0
                                , maskingImage.size.width
                                , maskingImage.size.height);
[maskingLayer setContents:(id)[maskingImage CGImage]];
[self.yourView.layer setMask:maskingLayer];
0
richy

Dans Swift 4.2 et Xcode 10.1

let myView = UIView()
myView.frame = CGRect(x: 200, y: 200, width: 200, height: 200)
myView.myViewCorners()
//myView.myViewCorners(width: myView.frame.width)//Pass View width
view.addSubview(myView)

extension UIView {
    //If you want only round corners
    func myViewCorners() {
        layer.cornerRadius = 10
        layer.borderWidth = 1.0
        layer.borderColor = UIColor.red.cgColor
        layer.masksToBounds = true
    }
    //If you want complete round shape, enable above comment line
    func myViewCorners(width:CGFloat) {
        layer.cornerRadius = width/2
        layer.borderWidth = 1.0
        layer.borderColor = UIColor.red.cgColor
        layer.masksToBounds = true
    }
}
0
iOS