LoginSignup
216
144

More than 5 years have passed since last update.

iOS11からViewの一部だけを角丸にすることが簡単になった

Last updated at Posted at 2017-09-25

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

Simulator Screen Shot - iPhone 7 - 2017-09-25 at 14.48.26.png

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]

Simulator Screen Shot - iPhone 7 - 2017-09-25 at 14.59.33.png

この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 右下
216
144
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
216
144