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?
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é.
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.
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
}
}
}
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!
Réponse courte:
myView.layer.cornerRadius = 8
myView.layer.masksToBounds = true // optional
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)
Vous pouvez définir des angles arrondis en modifiant la propriété cornerRadius
de la layer
de la vue.
blueView.layer.cornerRadius = 8
Les valeurs de rayon plus grandes donnent des angles plus arrondis
blueView.layer.cornerRadius = 25
et des valeurs plus petites donnent des angles moins arrondis.
blueView.layer.cornerRadius = 3
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
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:
clipsToBounds
et masksToBounds
sont tous deux équivalent _. C'est juste que le premier est utilisé avec UIView
et le second est utilisé avec CALayer
.
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.
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é.
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.
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
}
}
}
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];
view.layer.cornerRadius = 25
view.layer.masksToBounds = true
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];
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;
}
@IBDesignable
class DesignableView: UIView {
}
extension UIView
{
@IBInspectable
var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
}
}
}
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
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!
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)
}
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;
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];
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
}
}