Ios 将视图的右上角和左上角四舍五入?

Ios 将视图的右上角和左上角四舍五入?,ios,swift,uibezierpath,cashapelayer,Ios,Swift,Uibezierpath,Cashapelayer,我想知道如何屏蔽UIView以显示一个形状,该形状表示一个正方形,其上有半个圆 基本上,这就像将边界半径仅应用于顶部的两个角,以将它们四舍五入并创建圆弧 我用的是斯威夫特,这让我发疯 编辑:CornerRadius不符合我的要求。我觉得我必须使用CGShapeLayer,但我不确定如何创建圆弧 编辑2: 编辑3: 考虑到解释我想要什么,提供图片,解释我不明白我需要做什么,或者我需要如何做对某些人来说是不够的,以下是我尝试过的: 试图设置layer.cornerRadius属性,同时将视图的底部

我想知道如何屏蔽UIView以显示一个形状,该形状表示一个正方形,其上有半个圆

基本上,这就像将边界半径仅应用于顶部的两个角,以将它们四舍五入并创建圆弧

我用的是斯威夫特,这让我发疯

编辑:CornerRadius不符合我的要求。我觉得我必须使用CGShapeLayer,但我不确定如何创建圆弧

编辑2:

编辑3:

考虑到解释我想要什么,提供图片,解释我不明白我需要做什么,或者我需要如何做对某些人来说是不够的,以下是我尝试过的:

试图设置
layer.cornerRadius
属性,同时将视图的底部向外推过屏幕以隐藏底角,使其看起来不被截断,这种遮罩太圆,无法提供正确的圆弧结果

我尝试使用
UIBezierPath
设置顶部的两个角以使用视图的角半径
width/2
。这也没有产生适当的结果。在尝试将值硬编码到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. 
}
覆盖函数视图将出现(动画:Bool){
超级。视图将显示(动画)
设bezierPath=UIBezierPath(roundedRect:navBarView.bounds,byRoundingCorners:[.TopLeft、.TopRight],cornerRadii:cSizeMake(navBarView.bounds.width/2,navBarView.bounds.width/2)).CGPath;
设shapeLayer=CAShapeLayer();
shapeLayer.bounds=navBarView.bounds
shapeLayer.path=bezierPath
navBarView.layer.mask=shapeLayer

updateUI()//试试这个:

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;
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)
使用
UIBezierPath
类可以定义由直线段和曲线段组成的路径,并在自定义视图中渲染该路径

  • 在UIBezierPath中生成路径的圆角
  • 要生成CAShapeLayer,将其设置为路径之一
  • 图层到要在一侧仅圆角2作为遮罩图层的视图
  • 示例:

    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;
    
    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)
    
    结果:

    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;
    
    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)
    


    没有那么困难,您需要将遮罩添加到视图的层中。请注意,添加遮罩会将遮罩本身的所有内容删除。
    另一件你应该注意的事情是,如果你的视图也在调整大小,你需要调整遮罩,因为它不会自动更新路径。
    假设您正在使用SWIFT,您可以将UIView子类化:


    maskLayer
    是一个
    CAShapeLayer
    ,您必须将其创建为常量或惰性属性。

    代码未经测试。

    您好,我遇到了相同的问题,在通过调度队列调整视图大小后,我遇到了问题

        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
        }
    
    }
    
    希望这会有所帮助。

    经过测试和尝试,它与添加的.clipsToBounds完美结合,使之成为现实。效果非常好,特别是当嵌套到扩展函数中时,例如:

    SWIFT 3

    按如下方式调用以使特定视图左上角和右上角圆化:

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

    但是,请查看UIBezierPath(roundedRect..)的方法声明:
    角半径似乎已最大化到视图高度或宽度的一半,以较小者为准…

    您能显示您尝试过的代码以及您需要的输出类型吗?查看此代码:添加了我试图完成的内容。我正在使用swift,这让我发疯。代码在哪里?@vikingosegundo-代码与下面发布的代码相同。我尝试过使用cornerRadius和UIBezierPath,但未能获得正确的结果。你好,Ramesh,请在回答中添加更多详细信息,向可能无法理解代码的未来观众解释这是如何解决此问题的。此回答没有解释太多内容,甚至更改半径值也不会产生任何效果告诉我想要的结果。无论单面上的数字是多少,它都会切割一点点。我添加了一个我所追求的弧的图像。也许我仍然做得不对,我尝试将raid设置为视图的边界/2以及一些硬编码的值。在您的代码中,您正在使用边界。这些可能会给出不同的结果。检查更新的answer@Ramesh_T-这是所提供答案的结果:它也只影响左上方。--更改硬编码值也不会调整遮罩的形状。我在此处上载了示例应用:。它对我来说运行良好。此答案以及下面的答案的问题是,我已经尝试过UIBezier路径(并尝试了两种最终相同的解决方案)。结果与使用layer.cornerRadius属性没有什么不同。您确定删除了旧的corenrRadius设置吗?为了更好地理解您想要的内容,您可以发布一个小图形吗?该图形是主帖子中的一个图像,我确定我已删除了角半径设置,