Viewの一部を角丸にする方法がiOS11から簡単になってた
実装方法
例えばViewの右上と左下だけ角丸にしたい場合
iOS10系以前
これまでは、角丸のPathが指定されているCAShapeLayer
を作成し、それを角丸にしたいViewのマスクレイヤーに指定していた。
let redView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 100, height: 100)))
redView.center = view.center
redView.backgroundColor = .red
view.addSubview(redView)
//右上と左下を角丸にする設定
let path = UIBezierPath(roundedRect: redView.bounds, byRoundingCorners: [.bottomLeft, .topRight], cornerRadii: CGSize(width: 15, height: 15))
let mask = CAShapeLayer()
mask.path = path.cgPath
redView.layer.mask = mask
iOS11から
Viewの全ての角を丸くしたい時と同様にCALayerのcornerRadius
を指定すると共に、iOS11からCALayerにmaskedCorners
というプロパティが生えており、そこに角丸にしたい位置のオプション情報を指定するだけ。
let blueView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 100, height: 100)))
blueView.center = view.center
blueView.backgroundColor = .blue
view.addSubview(blueView)
//右上と左下を角丸にする設定
blueView.layer.cornerRadius = 15
blueView.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMinYCorner]
このmaskedCorners
プロパティはOptionSet
プロトコルに準拠したCACornerMask
という構造体です
CACornerMask.swift
public struct CACornerMask : OptionSet {
public init(rawValue: UInt)
public static var layerMinXMinYCorner: CACornerMask { get }
public static var layerMaxXMinYCorner: CACornerMask { get }
public static var layerMinXMaxYCorner: CACornerMask { get }
public static var layerMaxXMaxYCorner: CACornerMask { get }
}
プロパティ | 角丸になる場所 |
---|---|
layerMinXMinYCorner | 左上 |
layerMaxXMinYCorner | 右上 |
layerMinXMaxYCorner | 左下 |
layerMaxXMaxYCorner | 右下 |