圆整视图的右上angular和左上angular?

我想弄清楚如何掩盖一个UIView,以显示一个形状,代表一个半圆形的坐在上面的广场。

基本上,这就像将边界半径应用到顶部的两个angular,将其四舍五入来创build一个弧。

我正在迅速使用,这让我疯狂。

编辑:CornerRadius不会做我想要的。 我觉得我将不得不使用CGShapeLayer,但我不知道如何创build弧。

EDIT2: 在这里输入图像说明

EDIT3:

考虑到解释我想要的东西,提供图片,并解释说我不明白我需要做什么,或者我需要做些什么对一些人来说是不够的,这就是我所尝试的:

尝试设置layer.cornerRadius属性,同时将视图的底部向外推过屏幕,以隐藏底部的angular落显示中断,这种types的遮罩过于圆形,并没有提供适当的圆弧结果。

我试图使用UIBezierPath设置顶部的两个angular落使用views width / 2angularcornerRadii。 这也没有产生适当的结果。 在试图硬编码值到cornerRadii,我注意到,无论价值,我似乎无法获得我想要的结果。

还有什么其他的select? 或者我只是不正确地使用BezierPath?

编辑4:

这是我的原始代码。

 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) let bezierPath = UIBezierPath(roundedRect: navBarView.bounds, byRoundingCorners: [.TopLeft, .TopRight], cornerRadii: CGSizeMake(navBarView.bounds.width / 2, navBarView.bounds.width / 2)).CGPath; let shapeLayer = CAShapeLayer(); shapeLayer.bounds = navBarView.bounds shapeLayer.path = bezierPath navBarView.layer.mask = shapeLayer updateUI() // <-- Label text, etc. } 

另外,如前所述,曾尝试做navBarView.layer.cornerRadius = x

尝试这个:

 let path = UIBezierPath(roundedRect:self.view.bounds, byRoundingCorners:[.TopLeft, .TopRight], cornerRadii: CGSizeMake(20, 20)) let maskLayer = CAShapeLayer() maskLayer.frame = self.view.bounds; maskLayer.path = path.CGPath self.view.layer.mask = maskLayer; 

UIBezierPath类允许您定义由直线段和曲线段组成的path,并在自定义视图中显示该path。

  1. 在UIBezierPath中生成path的圆angular
  2. 要生成一个CAShapeLayer,它被设置为其中一个path
  3. 层到视图,你想在一边只有圆angular2作为蒙版图层

例:

 let DynamicView=UIView(frame: CGRectMake(50, 200, 200, 300)) DynamicView.backgroundColor=UIColor.redColor() let path = UIBezierPath(roundedRect:DynamicView.bounds, byRoundingCorners:[.TopLeft, .TopRight], cornerRadii: CGSizeMake(20, 20)) let maskLayer = CAShapeLayer() maskLayer.frame = DynamicView.bounds; maskLayer.path = path.CGPath DynamicView.layer.mask = maskLayer; self.view.addSubview(DynamicView) 

结果:

大段引用

没有那么困难,您需要将遮罩添加到视图的图层中。 请注意,添加面具会将面具本身的所有内容都剪掉。
另一件你应该注意的是,如果你的视图正在resize,那么你的面具需要适应,因为它不会自动更新path。
想象你正在使用SWIFT,你可以inheritanceUIView:

 override func layoutSubviews() { super.layoutSubviews() maskLayer.frame = layer.bounds maskLayer.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: [.TopLeft, .TopRight], cornerRadii: CGSizeMake(bounds.size.widht/2, bounds.size.widht/2)).CGPath } override init(frame: CGRect) { super.init(frame: frame) layer.mask = maskLayer } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) layer.mask = maskLayer } 

maskLayer是一个CAShapeLayer ,你必须创build一个常量或作为一个懒惰的属性。
该代码未经testing。

您好,我有同样的问题,我调整队列的大小后,视图被调整圆angular

  self.lblShortDescription.frame = CGRectMake(self.lblShortDescription.frame.origin.x, self.lblShortDescription.frame.origin.y, width, self.lblShortDescription.requiredHeight()) // here required height is the function to resize the label according to the content. dispatch_async(dispatch_get_main_queue(), { self.viewTopTitaleBack.round([UIRectCorner.TopLeft, UIRectCorner.TopRight], radius: 8.0) // here rounding is again a function I used for rounding the view by passing the parameters. }); extension UILabel{ func requiredHeight() -> CGFloat{ let label:UILabel = UILabel(frame: CGRectMake(0, 0, self.frame.width, CGFloat.max)) label.numberOfLines = 0 label.lineBreakMode = NSLineBreakMode.ByWordWrapping label.font = self.font label.text = self.text label.sizeToFit() return label.frame.height } } extension UIView { func round(corners: UIRectCorner, radius: CGFloat) -> CAShapeLayer { let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let mask = CAShapeLayer() mask.path = path.CGPath self.layer.mask = mask return mask } } 

希望这可以帮助。

经过testing,并尝试Ramesh_T的答案 ,它完美的作品与.clipsToBounds增加了真正的。 像魅力一样工作,特别是如果embedded到一个扩展函数,如:

SWIFT 3

 extension UIView { func roundCorners(_ corner: UIRectCorner,_ radii: CGFloat) { let maskLayer = CAShapeLayer() maskLayer.frame = self.layer.bounds maskLayer.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corner, cornerRadii: CGSize(width: radii, height: radii)).cgPath self.layer.mask = maskLayer layer.masksToBounds = true } } 

像这样调用来围绕左上angular和右下angular的特定视图:

 someView.roundCorners([.topRight,.topLeft], 60) 

编辑

然而,看UIBezierPath(roundedRect ..)的方法声明:似乎angular度半径是最大的一半视图的高度或宽度,以较小者为准…