ios使用尾随空间设置拐角半径,拐角半径不起作用

ios使用尾随空间设置拐角半径,拐角半径不起作用,ios,objective-c,Ios,Objective C,我参考了构建UIView和UIButton角半径的步骤 但我发现,当我设置尾随空间时,右角部分始终不会变成圆弧 我的代码如下所示: - (void)viewDidLoad { [super viewDidLoad]; self.btn = (UIButton*)[self roundCornerOnView:self.btn onTopLeft:YES topRight:YES bottomLeft:YES bottomRight:YES radius:5.0];

我参考了构建UIView和UIButton角半径的步骤

但我发现,当我设置尾随空间时,右角部分始终不会变成圆弧

我的代码如下所示:

 - (void)viewDidLoad {
     [super viewDidLoad];

     self.btn = (UIButton*)[self roundCornerOnView:self.btn onTopLeft:YES topRight:YES bottomLeft:YES bottomRight:YES radius:5.0];
     self.myView = (UIView*)[self roundCornerOnView:self.myView onTopLeft:YES topRight:YES bottomLeft:YES bottomRight:YES radius:5.0];

 }

 -(UIView*) roundCornerOnView:(UIView*)view onTopLeft:(BOOL)tl topRight:(BOOL)tr bottomLeft:(BOOL)bl bottomRight:(BOOL)br radius:(float)radius
 {
     if( tl || tr || bl || br )
     {
         UIRectCorner corner = 0;
         if (tr)
         {
             corner = corner | UIRectCornerTopRight;
         }
         if (br)
         {
             corner = corner | UIRectCornerBottomRight;
         }


         if( tl )
         {
             corner = corner | UIRectCornerTopLeft;
         }
         if (bl)
         {
             corner = corner | UIRectCornerBottomLeft;
         }

         UIView *roundedView = view;
         UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:roundedView.bounds byRoundingCorners:corner cornerRadii:CGSizeMake(radius, radius)];
         CAShapeLayer *maskLayer = [CAShapeLayer layer];
         maskLayer.frame = roundedView.bounds;
         maskLayer.path = maskPath.CGPath;
         roundedView.layer.mask = maskLayer;
         return roundedView;
     }
     else
     {
         return view;
     }

 }
我的布局如下:

 - (void)viewDidLoad {
     [super viewDidLoad];

     self.btn = (UIButton*)[self roundCornerOnView:self.btn onTopLeft:YES topRight:YES bottomLeft:YES bottomRight:YES radius:5.0];
     self.myView = (UIView*)[self roundCornerOnView:self.myView onTopLeft:YES topRight:YES bottomLeft:YES bottomRight:YES radius:5.0];

 }

 -(UIView*) roundCornerOnView:(UIView*)view onTopLeft:(BOOL)tl topRight:(BOOL)tr bottomLeft:(BOOL)bl bottomRight:(BOOL)br radius:(float)radius
 {
     if( tl || tr || bl || br )
     {
         UIRectCorner corner = 0;
         if (tr)
         {
             corner = corner | UIRectCornerTopRight;
         }
         if (br)
         {
             corner = corner | UIRectCornerBottomRight;
         }


         if( tl )
         {
             corner = corner | UIRectCornerTopLeft;
         }
         if (bl)
         {
             corner = corner | UIRectCornerBottomLeft;
         }

         UIView *roundedView = view;
         UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:roundedView.bounds byRoundingCorners:corner cornerRadii:CGSizeMake(radius, radius)];
         CAShapeLayer *maskLayer = [CAShapeLayer layer];
         maskLayer.frame = roundedView.bounds;
         maskLayer.path = maskPath.CGPath;
         roundedView.layer.mask = maskLayer;
         return roundedView;
     }
     else
     {
         return view;
     }

 }
按钮布局属性:

视图布局属性:

右边的部分始终是直角,如下所示。


如何解决设置尾随空间和角半径的元素的问题?

您应该更新视图的
布局子视图方法或视图控制器的
视图布局子视图方法内部
遮罩
层的
框架


因为设置遮罩层的
帧时,视图具有不同的帧。
autolayout
更新框架和布局子视图后,视图具有正确的
frame
值。而且可能
autolayout
UIView
级别上运行,而不是在
CALayer
级别上运行。因此,您应该在布局阶段后更新遮罩层的框架。

您应该更新视图的
布局子视图方法内部或视图控制器的
视图布局子视图内部
遮罩的
框架

因为设置遮罩层的
帧时,视图具有不同的帧。
autolayout
更新框架和布局子视图后,视图具有正确的
frame
值。而且可能
autolayout
UIView
级别上运行,而不是在
CALayer
级别上运行。因此,您应该在布局阶段之后更新遮罩层的框架。

为什么不使用

- (void)viewDidLoad {
    [super viewDidLoad];
    self.btn.layer.cornerRadius = 5;
    self.myView.layer.cornerRadius = 5;
}
您还可以通过用户定义的运行时属性在IB上设置这些属性

- (void)viewDidLoad {
    [super viewDidLoad];
    self.btn.layer.cornerRadius = 5;
    self.myView.layer.cornerRadius = 5;
}

您还可以通过用户定义的运行时属性在IB上设置这些属性

谢谢。尝试添加viewDidLayoutSubviews,它是正确的。很高兴它能工作。为了完整性,我建议在viewDidLoad中创建并添加遮罩层,然后在ViewDidLayoutSubView中更新其框架。因为随着方向的改变,viewDidLayoutSubviews可以再次调用,您不想创建和添加两次遮罩层;在那里。它们是从viewdidload调用的。如何在viewDidLoad中添加遮罩层?谢谢。基本上,您需要执行以下操作ViewDiLoad:创建和添加遮罩层ViewDidLayoutSubView:访问遮罩层并修改其框架您可以为此编写新方法或更改当前方法。谢谢。尝试添加viewDidLayoutSubviews,它是正确的。很高兴它能工作。为了完整性,我建议在viewDidLoad中创建并添加遮罩层,然后在ViewDidLayoutSubView中更新其框架。因为随着方向的改变,viewDidLayoutSubviews可以再次调用,您不想创建和添加两次遮罩层;在那里。它们是从viewdidload调用的。如何在viewDidLoad中添加遮罩层?谢谢。基本上,您需要执行以下操作ViewDiLoad:创建和添加遮罩层ViewDidLayoutSubView:访问遮罩层并修改其框架您可以为此编写新方法或更改当前方法。因为OP不希望圆角,可能…?
self.btn=(UIButton*)[self roundCornerOnView:self.btn onTopLeft:YES topRight:YES bottomLeft:YES bottomRight:YES radius:5.0];
对我来说似乎是所有的角落……是的,但他没有提到。也许我应该先问一下。很抱歉,因为OP不想把所有的角落都绕过去,也许……?
self.btn=(UIButton*)[self roundCornerOnView:self.btn onTopLeft:YES top right:YES bottomLeft:YES bottomRight:YES radius:5.0];
对我来说似乎无所不包……是的,但他没有提到。也许我应该先问一下。对不起