完善视图的右上角和左上角?

时间:2016-01-19 13:35:57

标签: ios swift uibezierpath cashapelayer

我试图弄清楚如何屏蔽UIView以显示一个形状,该形状代表一个坐在其上面的半圆形的正方形。

基本上,就像将边界半径仅应用于顶部两个角以将它们圆化并创建弧形。

我使用swift,这让我发疯了。

编辑:CornerRadius没有做我想做的事。我觉得我必须使用CGShapeLayer,但我不确定如何创建弧。

EDIT2: enter image description here

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

4 个答案:

答案 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类可让您定义由直线段和曲线段组成的路径,并在自定义视图中渲染该路径。

  1. 在UIBezierPath
  2. 中生成路径的圆角
  3. 要生成CAShapeLayer,请将其设置为路径之一
  4. 将视图层设置为您希望在一侧仅将圆角2作为遮罩层
  5. 示例:

    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)
    

    <强>结果:

      

    Blockquote

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

maskLayerCAShapeLayer,您必须将其创建为常量或惰性属性。
代码未经过测试。

答案 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_Tanswer,它与.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 ..): 似乎角半径最大可达到视图高度或宽度的一半,以较小者为准......