如何只为左下角,右下角和左上角的textview设置cornerRadius?

Zep*_*ept 48 rounded-corners textview swift

如何仅在左下角,右下角和左上角的textview中设置角半径?

let rectShape = CAShapeLayer()
    rectShape.backgroundColor = UIColor.redColor().CGColor
    rectShape.bounds = messages.frame
    rectShape.position = messages.center
    rectShape.path = UIBezierPath(roundedRect: messages.bounds, byRoundingCorners: .BottomLeft | .TopRight, cornerRadii: CGSize(width: 20, height: 20)).CGPath

    messages.layer.addSublayer(rectShape)
Run Code Online (Sandbox Code Playgroud)

这段代码创建了两个rect.我不知道为什么.

Fab*_*bio 118

(swift 4/iOS 11)只是简单地说底部:

yourView.clipsToBounds = true 
yourView.layer.cornerRadius = 10
yourView.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMinXMaxYCorner]
Run Code Online (Sandbox Code Playgroud)

for up:

yourView.clipsToBounds = true 
yourView.layer.cornerRadius = 10
yourView.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

yourView.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMinXMaxYCorner, .layerMinXMinYCorner]
Run Code Online (Sandbox Code Playgroud)

希望这有帮助:)

  • 请注意,这仅适用于iOS 11.0+ (2认同)

Sha*_*var 70

您只需要屏蔽图层,如下所示:

对于Swift 3:

    let rectShape = CAShapeLayer()
    rectShape.bounds = self.myView.frame
    rectShape.position = self.myView.center
    rectShape.path = UIBezierPath(roundedRect: self.myView.bounds, byRoundingCorners: [.bottomLeft , .bottomRight , .topLeft], cornerRadii: CGSize(width: 20, height: 20)).cgPath

     self.myView.layer.backgroundColor = UIColor.green.cgColor
    //Here I'm masking the textView's layer with rectShape layer
     self.myView.layer.mask = rectShape
Run Code Online (Sandbox Code Playgroud)

较低版本:

let rectShape = CAShapeLayer()
rectShape.bounds = self.myView.frame
rectShape.position = self.myView.center
rectShape.path = UIBezierPath(roundedRect: self.myView.bounds, byRoundingCorners: .BottomLeft | .BottomRight | .TopLeft, cornerRadii: CGSize(width: 20, height: 20)).CGPath

 self.myView.layer.backgroundColor = UIColor.greenColor().CGColor
//Here I'm masking the textView's layer with rectShape layer
 self.myView.layer.mask = rectShape
Run Code Online (Sandbox Code Playgroud)

  • 我认为`byRoundingCorners`需要一个数组,所以在上面的例子中它应该是:`byRoundingCorners:[.BottomLeft,.BottomRight,.TopLeft]` (7认同)
  • 不适合底层.即bottomLeft&bottomRight (5认同)
  • 抱歉,我想问另一个问题。我不能向右圆角。.TopRight 和 .ButtonRight 不起作用 (2认同)

Mus*_*ari 52

在xcode 8和swift 3中测试过

extension UIView {
    func roundCorners(_ corners:UIRectCorner, radius: CGFloat) {
    let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
    let mask = CAShapeLayer()
    mask.path = path.cgPath
    self.layer.mask = mask
  }
}
Run Code Online (Sandbox Code Playgroud)

它像这样使用

YourView.roundCorners([.topLeft, .bottomLeft], radius: 10)
Run Code Online (Sandbox Code Playgroud)

  • 不适合底层.即bottomLeft&bottomRight (13认同)
  • 我遇到了类似的问题,无法为右上角和右下角工作。我通过在视图控制器的 viewDidLayoutSubviews 和表格视图单元的 layoutSubviews 中调用它来修复它。它对我有用。 (3认同)
  • 我的右上角和右下角有问题。:( (2认同)

kin*_*g_T 19

iOS 11和iOS 10底角的更好答案是

 if #available(iOS 11.0, *){
        view.clipsToBounds = true
        view.layer.cornerRadius = 10
        view.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMinXMaxYCorner]
    }else{
       let rectShape = CAShapeLayer()
       rectShape.bounds = view.frame
       rectShape.position = view.center
       rectShape.path = UIBezierPath(roundedRect: view.bounds,    byRoundingCorners: [.bottomLeft , .bottomRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath
      view.layer.backgroundColor = UIColor.green.cgColor
      view.layer.mask = rectShape
  }
Run Code Online (Sandbox Code Playgroud)

如果这在iOS 10及更低版本上不起作用,请尝试在viewcontroller类的viewDidLayoutSubviews()中运行代码,如下所示

override func viewDidLayoutSubviews() {
    if #available(iOS 11.0, *){
    }else{
       let rectShape = CAShapeLayer()
       rectShape.bounds = view.frame
       rectShape.position = view.center
       rectShape.path = UIBezierPath(roundedRect: view.bounds,    byRoundingCorners: [.bottomLeft , .bottomRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath
       view.layer.backgroundColor = UIColor.green.cgColor
       view.layer.mask = rectShape
}
Run Code Online (Sandbox Code Playgroud)

  • 完美适用于iOS 11 (2认同)

Ras*_*tif 13

斯威夫特 4+

func roundCorners(with CACornerMask: CACornerMask, radius: CGFloat) {
          self.layer.cornerRadius = radius
          self.layer.maskedCorners = [CACornerMask]
    }
Run Code Online (Sandbox Code Playgroud)

右上

roundCorners(with: [.layerMinXMinYCorner], radius: 20)
Run Code Online (Sandbox Code Playgroud)

左上方

roundCorners(with: [.layerMaxXMinYCorner], radius: 20)
Run Code Online (Sandbox Code Playgroud)

右下角

roundCorners(with: [.layerMinXMaxYCorner], radius: 20)
Run Code Online (Sandbox Code Playgroud)

左下方

roundCorners(with: [.layerMaxXMaxYCorner], radius: 20)
Run Code Online (Sandbox Code Playgroud)

或者

多个角同时

    func roundedCorners(corners : UIRectCorner, radius : CGFloat) {
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        layer.mask = mask
    }
Run Code Online (Sandbox Code Playgroud)

如何使用

roundedCorners(corners: [.topLeft, .topRight], radius: 20)
Run Code Online (Sandbox Code Playgroud)


Bha*_*esh 8

斯威夫特4

override func viewDidLoad() {
    let topRight = UIView(frame: CGRect(x: 120, y: 200, width: 120, height: 120))
    topRight.roundedTop()
    topRight.backgroundColor = .red
    self.view.center = topRight.center
    self.view.addSubview(topRight)
    super.viewDidLoad()
}
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

UIView Swift 4上的扩展:参考链接


Cha*_*lva 7

这是 iOS 11+ 的扩展

 import Foundation
 import UIKit

 extension UIView {

   func roundCorners(_ corners: CACornerMask, radius: CGFloat, borderColor: UIColor, borderWidth: CGFloat) {
       self.layer.maskedCorners = corners
       self.layer.cornerRadius = radius
       self.layer.borderWidth = borderWidth
       self.layer.borderColor = borderColor.cgColor
    
   }

 }
Run Code Online (Sandbox Code Playgroud)

用法:-

self.yourView.roundCorners([.layerMaxXMaxYCorner, .layerMaxXMinYCorner], radius: 20.0, borderColor: UIColor.green, borderWidth: 1)
Run Code Online (Sandbox Code Playgroud)

斯威夫特 5+

view.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMaxXMinYCorner]
Run Code Online (Sandbox Code Playgroud)


kaz*_*mun 6

  1. 将 RoundedCornerView.swift 文件添加到您的项目中
  2. 将 UIView 添加到您的 ViewController
  3. 将 Identity Inspector 中的自定义类更改为 RoundedCornerView
  4. 转到 Attribute Inspector 选择 Corner Radius (CGFloat) 并在您想要圆角的角上。

圆角视图

RoundedCornerView.swift

import UIKit

@IBDesignable
class RoundedCornerView: UIView {

    var cornerRadiusValue : CGFloat = 0
    var corners : UIRectCorner = []

    @IBInspectable public var cornerRadius : CGFloat {
        get {
            return cornerRadiusValue
        }
        set {
            cornerRadiusValue = newValue
        }
    }

    @IBInspectable public var topLeft : Bool {
        get {
            return corners.contains(.topLeft)
        }
        set {
            setCorner(newValue: newValue, for: .topLeft)
        }
    }

    @IBInspectable public var topRight : Bool {
        get {
            return corners.contains(.topRight)
        }
        set {
            setCorner(newValue: newValue, for: .topRight)
        }
    }

    @IBInspectable public var bottomLeft : Bool {
        get {
            return corners.contains(.bottomLeft)
        }
        set {
            setCorner(newValue: newValue, for: .bottomLeft)
        }
    }

    @IBInspectable public var bottomRight : Bool {
        get {
            return corners.contains(.bottomRight)
        }
        set {
            setCorner(newValue: newValue, for: .bottomRight)
        }
    }

    func setCorner(newValue: Bool, for corner: UIRectCorner) {
        if newValue {
            addRectCorner(corner: corner)
        } else {
            removeRectCorner(corner: corner)
        }
    }

    func addRectCorner(corner: UIRectCorner) {
        corners.insert(corner)
        updateCorners()
    }

    func removeRectCorner(corner: UIRectCorner) {
        if corners.contains(corner) {
            corners.remove(corner)
            updateCorners()
        }
    }

    func updateCorners() {
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: cornerRadiusValue, height: cornerRadiusValue))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
    }

}
Run Code Online (Sandbox Code Playgroud)

github链接:RoundedCornerView


小智 5

ez方式

用于子视图和弹出窗口 [Swift 5]

override func layoutSublayers(of layer: CALayer) {
    searchBarPopup.clipsToBounds = true
    searchBarPopup.layer.cornerRadius = 10
    searchBarPopup.layer.maskedCorners = [ .layerMaxXMinYCorner, .layerMinXMinYCorner]
}
Run Code Online (Sandbox Code Playgroud)

输出:

图片


小智 5

我能想出的上述所有解决方案的最佳解决方案是这个。

extension UIView {
    func roundCorners(_ corners: UIRectCorner, radius: CGFloat) {
        if #available(iOS 11, *) {
            var cornerMask = CACornerMask()
            if(corners.contains(.topLeft)){
                cornerMask.insert(.layerMinXMinYCorner)
            }
            if(corners.contains(.topRight)){
                cornerMask.insert(.layerMaxXMinYCorner)
            }
            if(corners.contains(.bottomLeft)){
                cornerMask.insert(.layerMinXMaxYCorner)
            }
            if(corners.contains(.bottomRight)){
                cornerMask.insert(.layerMaxXMaxYCorner)
            }
            self.layer.cornerRadius = radius
            self.layer.maskedCorners = cornerMask

        } else {
            let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            self.layer.mask = mask
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我相信这种方式在选择双方时实施起来很容易。

view.roundCorners([.bottomLeft, .bottomRight, .topLeft], radius: 16)
Run Code Online (Sandbox Code Playgroud)