我试图弄清楚如何屏蔽UIView以显示一个形状,该形状代表一个坐在其上面的半圆形的正方形。
基本上,就像将边界半径仅应用于顶部两个角以将它们圆化并创建弧形。
我使用swift,这让我发疯了。
编辑:CornerRadius没有做我想做的事。我觉得我必须使用CGShapeLayer,但我不确定如何创建弧。EDIT3:
考虑解释我想要的东西,提供图片,并解释我不了解我需要做什么,或者我需要做些什么对某些人来说还不够,这里有#s我尝试过的事情:
尝试设置layer.cornerRadius
属性,同时将视图的底部推出屏幕以隐藏底角不会出现剪切,这种类型的遮罩太圆形并且没有提供正确的圆弧效果。
我尝试使用UIBezierPath
设置前两个角来使用视图width / 2
的cornerRadii。这也没有产生适当的结果。在尝试将值硬编码到cornerRadii中时,我注意到无论值如何,我似乎无法获得我想要的结果。
还有哪些其他选择?或者我只是错误地使用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
答案 0 :(得分:5)
试试这个:
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
类可让您定义由直线段和曲线段组成的路径,并在自定义视图中渲染该路径。
示例:强>
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)
<强>结果:强>
答案 1 :(得分:1)
不是那么困难,你需要在视图层添加蒙版。注意添加面膜会切掉面膜本身的所有东西
另外你应该注意的是,如果你的视图正在调整大小,你需要调整面具,因为它不会自动更新路径。
想象您正在使用SWIFT,您可以继承UIView:
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
,您必须将其创建为常量或惰性属性。
代码未经过测试。
答案 2 :(得分:1)
嗨我有同样的问题,我通过调度队列
调整视图大小后圆角 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
}
}
希望这有帮助。
答案 3 :(得分:1)
经过测试并尝试Ramesh_T的answer,它与.clipsToBounds的添加完美配合。像魅力一样工作,特别是如果嵌套到扩展函数中,例如:
( SWIFT 3 )
someView.roundCorners([.topRight,.topLeft], 60)
这样调用以围绕特定视图左上角和右上角:
cat /var/www-allow/client1-allow.conf
allow 192.168.1.1;
allow 10.0.0.1;
cat /etc/nginx/sites/client1.conf
...
server {
include /var/www-allow/client1-allow.conf;
deny all;
}
修改强>
但是,查看UIBezierPath的方法声明(roundedRect ..): 似乎角半径最大可达到视图高度或宽度的一半,以较小者为准......