给UIView圆角

its*_*ode 562 cocoa-touch uiview ios

我的登录视图有一个子视图,其中有一个UIActivityView和一个UILabel说"登录...".此子视图的拐角不是圆角.我怎样才能让它们成圆形?

有没有办法在我的xib中做到这一点?

Ed *_*rty 1196

试试这个

#import <QuartzCore/QuartzCore.h> // not necessary for 10 years now  :)
Run Code Online (Sandbox Code Playgroud)

...

view.layer.cornerRadius = 5;
view.layer.masksToBounds = true;
Run Code Online (Sandbox Code Playgroud)

注意:如果你想圆角应用到UIViewController的看法,它不应该在视图控制器的构造函数应用,而是在-viewDidLoadview实际实例.

  • 相关说明:任何对更多视觉好东西(即影子)感兴趣的人都可以轻松申请UIView,请查看CALayer类参考.其中大部分都像设置一个或两个属性值一样简单,如上面的答案:http://developer.apple.com/mac/library/documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html (17认同)
  • 请注意,该属性仅存在于iPhone 3.0中,而不是早期版本. (6认同)
  • @Ben Collins(或其他有此问题的人),确保您的视图设置了"剪辑子视图".您可以在界面构建器中进行检查. (6认同)
  • 我只想说这是我见过的最令人满意的答案之一.首先在这里检查只是让我花了一个小时与图像编辑器进行战斗,并且会使我的视图更容易变色.谢谢! (5认同)
  • 这很有效但是如果你在任何类型的滚动视图或动画中有很多这些圆角(我尝试在UITableView中使用它们)你的性能会受到很大影响.漂亮的平滑滚动表视图迅速变得波涛汹涌:( (2认同)

Guj*_*min 257

您还可以使用界面构建器的" 用户定义的运行时属性"功能来设置layer.cornerRadius值的键路径.请确保您包含QuartzCore库.

这个技巧也适用于设置layer.borderWidth但是它不起作用,layer.borderColor因为这期望CGColor不是a UIColor.

您将无法在故事板中看到效果,因为这些参数是在运行时评估的.

使用

  • 记得检查视图IB中的`Clip Subviews`选项 (9认同)
  • (或)添加一个Key Path:layer.masksToBounds,Type:boolean:Checked (2认同)

Gui*_*tro 61

现在,您可以在UIView中使用swift类别(图片中的代码),并在@IBInspectable中显示故事板上的结果(如果您使用的是类别,请仅使用cornerRadius而不是layer.cornerRadius作为键路径.

extension UIView {
    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Sur*_*gch 54

迅速

简短回答:

myView.layer.cornerRadius = 8
myView.layer.masksToBounds = true  // optional
Run Code Online (Sandbox Code Playgroud)

补充答案

如果你已经得到这个答案,你可能已经看到了足以解决你的问题.我正在添加这个答案,以便为事情做他们所做的事情提供更多的视觉解释.

如果你从常规开始,UIView它有方角.

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

在此输入图像描述

您可以通过更改cornerRadius视图的属性来赋予它圆角layer.

blueView.layer.cornerRadius = 8
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

较大的半径值会产生更圆的角

blueView.layer.cornerRadius = 25
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

较小的值会产生较少的圆角.

blueView.layer.cornerRadius = 3
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这可能足以解决您的问题.但是,有时视图可以具有超出视图边界的子视图或子图层.例如,如果我是添加子视图像这样

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

或者如果我要添加子这样

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

然后我会结束

在此输入图像描述

现在,如果我不想让事情悬而未决,我可以做到这一点

blueView.clipsToBounds = true
Run Code Online (Sandbox Code Playgroud)

或这个

blueView.layer.masksToBounds = true
Run Code Online (Sandbox Code Playgroud)

这给出了这个结果:

在此输入图像描述

这两个clipsToBoundsmasksToBounds相等的.只是第一个用于,UIView第二个用于CALayer.

也可以看看

  • 我还想补充说,将角半径设置为较短边的一半(在这种情况下为`blueView.frame.size.height/2`)会产生一个完美的圆角. (4认同)

Kri*_*sen 43

与Ed Marty所做的不同:

#import <QuartzCore/QuartzCore.h>

[v.layer setCornerRadius:25.0f];
[v.layer setMasksToBounds:YES];
Run Code Online (Sandbox Code Playgroud)

你需要setMasksToBounds来加载IB中的所有对象...我遇到了一个问题,我的视图已经四舍五入,但是没有来自IB的对象:/

这固定了= D希望它有所帮助!

  • 它有什么不同?除了不使用点语法? (46认同)
  • [v.layer setMasksToBounds:YES]; \n这条线很神奇,它解决了我的大问题 (3认同)
  • 我在开始iOS开发时编写了这个,并且不知道点语法和括号语法之间没有区别.因此我把它写成"不同".我的代码还包括Ed Marty在其原始响应中没有的import <>(后来编辑过),因此我的回答可以帮助人们解决他们的问题(也就是说没有导入它). (3认同)

pab*_*z55 27

正如本博文中所描述的,是一个圆角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];
}
Run Code Online (Sandbox Code Playgroud)

关于它的很酷的部分是你可以选择你想要四舍五入的角落.

  • 我们不是仅提供指向外部网站的链接,而是希望答案在这里是自包含的,因此我将链接的博客文章中的相关代码添加到您的答案中.人们可以访问博客文章了解更多细节,但这可确保如果相关帖子消失,内容将继续存在.此外,您将此答案发布到几个不同的问题,这些问题并没有真正提出同样的问题.那些被删除,一个问题被关闭作为这个问题的副本.我们希望能够找到符合每个问题的答案. (6认同)
  • 先见之明.博客文章现在是404. (5认同)

Sam*_*han 19

您需要先导入头文件 <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];
Run Code Online (Sandbox Code Playgroud)

不要错过使用 - setMasksToBounds否则可能无法显示效果.

  • @LordZsolt也许他们用iOS7改变了,但你不需要再导入QuartzCore了. (3认同)
  • 不需要导入"QuartzCore/QuartzCore.h" (2认同)

Vak*_*kas 11

您可以使用以下自定义UIView类,它也可以更改边框颜色和宽度.因为这是IBDesignalbe您可以更改界面构建器中的属性.

在此输入图像描述

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
        }
    }

}
Run Code Online (Sandbox Code Playgroud)


小智 8

view.layer.cornerRadius = 25
view.layer.masksToBounds = true
Run Code Online (Sandbox Code Playgroud)


jor*_*rik 6

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];
Run Code Online (Sandbox Code Playgroud)

  • 这与此主题上的其他答案没有什么不同. (4认同)

Moj*_*ini 5

- SwiftUI

\n\n

在 SwiftUI 中,您可以cornerRadius直接在任何您想要的地方使用修饰符View。\n例如这个问题:

\n\n
Text("Signing In\xe2\x80\xa6")\n    .padding(16)\n    .background(Color.red)\n    .cornerRadius(50)\n
Run Code Online (Sandbox Code Playgroud)\n\n

预览

\n\n

请注意,不再有类似菱形的半径,因此即使您将cornerRadius设置为超过高度的一半,它也会平滑地变圆。

\n\n

查看 此答案以了解如何在 SwiftUI 中圆化特定角

\n