以下を使用して4つのコーナーすべてを丸くできることを知っています。
myBtn.layer.cornerRadius = 8
myBtn.layer.masksToBounds = true
私は2つだけを丸めたいので、いくつかの調査を行って this :
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
}
}
これは次のように呼び出されます:
view.roundCorners([.TopLeft , .TopRight], radius: 10)
しかし、これはUIButtonでは機能しません。拡張機能をUIButton型に切り替えてbuttonに渡すと、出力は次のようになります。
問題は、UIButtonで動作するようにこれをどのように適応させるかです。
UIButtonの拡張機能を追加:
extension UIButton{
func roundedButton(){
let maskPath1 = UIBezierPath(roundedRect: bounds,
byRoundingCorners: [.topLeft , .topRight],
cornerRadii: CGSize(width: 8, height: 8))
let maskLayer1 = CAShapeLayer()
maskLayer1.frame = bounds
maskLayer1.path = maskPath1.cgPath
layer.mask = maskLayer1
}
}
viewDidAppear/viewDidLayoutSubviewsでの呼び出し:
btnCorner.roundedButton()
ボタンコーナーアウトプット:
Swift 4:最新のiOS 11以降
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 11.0, *) {
self.viewToRound.clipsToBounds = true
viewToRound.layer.cornerRadius = 20
viewToRound.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
} else {
// Fallback on earlier versions
}
}
以前のiOS(10,9など)バージョン(iOS 11でも動作します)
override func viewDidLayoutSubviews() {
self.viewToRound.clipsToBounds = true
let path = UIBezierPath(roundedRect: viewToRound.bounds,
byRoundingCorners: [.topRight, .topLeft],
cornerRadii: CGSize(width: 20, height: 20))
let maskLayer = CAShapeLayer()
maskLayer.path = path.cgPath
viewToRound.layer.mask = maskLayer
}
Swiftの場合、Kirit Modiの答えは次のように変更されます。
extension UIButton {
func roundedButton(){
let maskPAth1 = UIBezierPath(roundedRect: self.bounds,
byRoundingCorners: [.topLeft , .topRight],
cornerRadii:CGSize(width:8.0, height:8.0))
let maskLayer1 = CAShapeLayer()
maskLayer1.frame = self.bounds
maskLayer1.path = maskPAth1.cgPath
self.layer.mask = maskLayer1
}
}
拡張機能のファイルの先頭に追加することを忘れないでください:
import UIKit
IViewの拡張が必要な場合、上または下の角を丸くするオプションを使用できます:
extension UIView {
func roundedCorners(top: Bool){
let corners:UIRectCorner = (top ? [.topLeft , .topRight] : [.bottomRight , .bottomLeft])
let maskPAth1 = UIBezierPath(roundedRect: self.bounds,
byRoundingCorners: corners,
cornerRadii:CGSize(width:8.0, height:8.0))
let maskLayer1 = CAShapeLayer()
maskLayer1.frame = self.bounds
maskLayer1.path = maskPAth1.cgPath
self.layer.mask = maskLayer1
}
}
ボタンとして次のように呼び出されます:
myButton.roundedCorners(top: true)
iOS 11では、角を丸くするのが本当に簡単になりました。以下のコードは、左上隅と右下隅を丸めます。
myView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMaxYCorner]
拡張機能を次のように更新します。
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()
let rect = self.bounds
mask.frame = rect
mask.path = path.cgPath
self.layer.mask = mask
}
}
形状レイヤー(マスク)はフレームを知る必要があります
このコードを使用して、
let path = UIBezierPath(roundedRect:viewTo.bounds, byRoundingCorners:[.TopRight, .TopLeft], cornerRadii: CGSizeMake(20, 20))
let maskLayer = CAShapeLayer()
maskLayer.path = path.CGPath
viewTo.layer.mask = maskLayer
その役に立つことを願って
シェイプレイヤーのフレームを設定するのを忘れました:
mask.frame = layer.bounds
Swift 5および最大の柔軟性
roundCorners関数で拡張機能を定義する
extension UIButton {
func roundCorners(corners: UIRectCorner, radius: Int = 8) {
let maskPath1 = UIBezierPath(roundedRect: bounds,
byRoundingCorners: corners,
cornerRadii: CGSize(width: radius, height: radius))
let maskLayer1 = CAShapeLayer()
maskLayer1.frame = bounds
maskLayer1.path = maskPath1.cgPath
layer.mask = maskLayer1
}
}
roundCorners関数を呼び出します
myButton.roundCorners(corners: [.topLeft, .topRight])
または特定の半径
myButton.roundCorners(corners: [.topLeft, .topRight], radius: 20)
丸みはビュー/ボタンの角に適用されますが、ボタンの境界に来ると、正しく適用されません。その解決策はありますか? @
ここに私が使用したコードがあります。これはiOS11.0以上で動作(境界)しており、以下のバージョンでは動作していません
if #available(iOS 11.0, *) {
self.layer.cornerRadius = radius
self.layer.maskedCorners = maskedCorners
} else {
let shapeLayer = CAShapeLayer()
shapeLayer.position = self.center
self.layer.masksToBounds = true
self.clipsToBounds = true
let bezirePath = UIBezierPath(roundedRect: self.bounds,
byRoundingCorners: corners,
cornerRadii: CGSize(width: radius, height: radius))
shapeLayer.bounds = frame
shapeLayer.path = bezirePath.cgPath
self.layer.mask = shapeLayer