圆角仅在UIView之上

mar*_*LAN 45 core-graphics objective-c rounded-corners uiview

嗨,我正在寻找一个干净的解决方案,没有覆盖drawRect或类似的东西UIView,在视图的顶部创建一个圆角.我的主要问题是如果视图调整大小或类似的话,创建变量解决方案.有清洁的解决方案吗?Apple也是第一个表项目.做到这一点并不难.

Ash*_*lls 162

您可以通过mask在视图的图层上设置一个来完成此操作:

CAShapeLayer * maskLayer = [CAShapeLayer layer];
maskLayer.path = [UIBezierPath bezierPathWithRoundedRect: self.bounds byRoundingCorners: UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii: (CGSize){10.0, 10.}].CGPath;

self.layer.mask = maskLayer;
Run Code Online (Sandbox Code Playgroud)

重要提示:您应该在视图的layoutSubviews()方法中执行此操作,因此视图已从故事板中调整大小


在Swift <= 1.2

let maskLayer = CAShapeLayer()
maskLayer.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: .TopLeft | .TopRight, cornerRadii: CGSize(width: 10.0, height: 10.0)).CGPath

layer.mask = maskLayer
Run Code Online (Sandbox Code Playgroud)

Swift 2.x

let maskLayer = CAShapeLayer()
maskLayer.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: UIRectCorner.TopLeft.union(.TopRight), cornerRadii: CGSizeMake(10, 10)).CGPath
layer.mask = maskLayer
Run Code Online (Sandbox Code Playgroud)

Swift 3.x

let maskLayer = CAShapeLayer()
maskLayer.path = UIBezierPath(roundedRect: view.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(width: 10, height: 10)).cgPath
layer.mask = maskLayer
Run Code Online (Sandbox Code Playgroud)

  • 有没有人有这个问题只围绕左角? (17认同)
  • @random你的布局改变了吗?例如,如果将代码放在`UIViewController`的`viewDidLoad`中并且视图通过autolayout调整大小,则会发生.如果您将代码移动到`viewDidLayoutSubviews`,那么它就会被解决. (6认同)
  • 如何添加边框宽度和颜色? (3认同)

Nha*_*inh 14

刚试过Swift 3.0,Xcode 8.0:

记得设置你的按钮viewDidLayoutSubviews()layoutSubViews描述@rob 这里.

当你想改变你的按钮背景时,你只需要打电话:

yourButton.backgroundColor = UIColor.someColour
Run Code Online (Sandbox Code Playgroud)

资源:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    yourButton.layer.masksToBounds = true
    yourButton.roundCorners(corners: [.topLeft,.topRight], radius: 5)
}

extension UIButton
{
    func roundCorners(corners:UIRectCorner, radius: CGFloat)
    {
        let maskLayer = CAShapeLayer()
        maskLayer.path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)).cgPath
        self.layer.mask = maskLayer
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 结果如下:

默认状态:

在此输入图像描述

选择状态:

在此输入图像描述

希望这有帮助!!


Tre*_*v14 13

现代简单的解决方案

iOS 11+

现在我们maskedCorners在视图的图层上有了这个属性,它让生活变得更轻松。

只需设置所需的角半径并指定应屏蔽哪些角即可。最好的部分是这与边框配合得很好 - 无论是否圆角,图层边框都将跟随图层的边缘!在操场上试试下面的代码(记得按一下打开实时视图,command+option+return这样你就可以看到它的样子)

import UIKit
import PlaygroundSupport

let wrapperView = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 160))
wrapperView.backgroundColor = .lightGray

let roundedCornerView = UIView(frame: CGRect(x: 50, y: 50, width: 300, height: 60))
roundedCornerView.backgroundColor = .white

wrapperView.addSubview(roundedCornerView)

roundedCornerView.layer.cornerRadius = 10
roundedCornerView.layer.borderColor = UIColor.red.cgColor
roundedCornerView.layer.borderWidth = 1


// this is the key part - try out different corner combinations to achieve what you need
roundedCornerView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]


PlaygroundPage.current.liveView = wrapperView
Run Code Online (Sandbox Code Playgroud)

这是它的样子:

在此处输入图片说明


Fed*_*deH 9

对于 iOS11 及更高版本,您可以使用视图的 layer 属性:

@property CACornerMask maskedCorners
Run Code Online (Sandbox Code Playgroud)

这定义了在使用cornerRadius属性时四个角中的哪一个接收遮罩。默认为所有四个角。(苹果文档)

  • 它在`layer` 属性上,而不是直接在视图上(来自ViewController 的`view.layer`)。 (2认同)

Has*_*jmi 5

圆角的 UIView 扩展(Swift 4):

extension UIView {

    /// Round UIView selected corners
    ///
    /// - Parameters:
    ///   - corners: selected corners to round
    ///   - radius: round amount
    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)

例子:

ratingView.roundCorners([.topLeft, .topRight, .bottomRight], radius: 6)
Run Code Online (Sandbox Code Playgroud)