UIViewの左上隅と右上隅のみにcornerRadiusを設定するにはどうすればよいですか?


408

cornerRadius左上隅と右上隅のみを設定する方法はありUIViewますか?

以下を試してみましたが、もう景色が見えなくなりました。

UIView *view = [[UIView alloc] initWithFrame:frame];

CALayer *layer = [CALayer layer];
UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRoundedRect:frame byRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight) cornerRadii:CGSizeMake(3.0, 3.0)];
layer.shadowPath = shadowPath.CGPath;
view.layer.mask = layer;

9
編集後、修正する3つの点:(1)丸みのあるパスはに基づいてview.boundsいない必要がありますframe(2)レイヤーはに基づいている必要がCAShapeLayerありCALayerます。(3)pathではなく、レイヤーを設定しshadowPathます。
カートRevis

1
この質問回答の重複の可能性があります
Stuart

ベジェ曲線アルゴリズムを使用して、CGPath上に曲線を作成します。CoreGraphicsの一部であると確信しています。そうでない場合は、en.wikipedia.org / wiki /Bézier_curveにいくつかの優れた定義とアニメーションがあります。
Nate Symer、2015年


ここで私の答えを参照してください:stackoverflow.com/a/50396485/6246128
wcarhart

回答:


225

レイアウト制約が関連付けられている場合は、UIViewサブクラスで次のように更新する必要があることに注意してください。

override func layoutSubviews() {
    super.layoutSubviews()
    roundCorners(corners: [.topLeft, .topRight], radius: 3.0)
}

そうしないと表示されません。


そして、角を丸めるには、拡張機能を使用します。

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

3
それは絶対に答えではありません、著者は特定のコーナーを丸める方法を尋ねました、コーナーの半径をレイアウトの変更と同期させる方法ではありません。
kelin 2018年

1
これは答えが意味をなさないことです。
Tiago Couto

1
答えは最近修正されました。@ kelin
マイケル

2
これは間違いなく角を曲がった。
aznelite89

ビューが表示された後、これを行う必要があります
ジョナサン。

535

あなたの解決策がうまくいかなかった理由はわかりませんが、次のコードが私のために働いています。ベジェマスクを作成し、ビューに適用します。以下のコードでは、の下端を_backgroundView半径3ピクセルで丸めています。selfカスタムUITableViewCellです:

UIBezierPath *maskPath = [UIBezierPath
    bezierPathWithRoundedRect:self.backgroundImageView.bounds
    byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight)
    cornerRadii:CGSizeMake(20, 20)
];

CAShapeLayer *maskLayer = [CAShapeLayer layer];

maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;

self.backgroundImageView.layer.mask = maskLayer;

いくつかの改良を加えたSwiftバージョン:

let path = UIBezierPath(roundedRect:viewToRound.bounds, byRoundingCorners:[.TopRight, .BottomLeft], cornerRadii: CGSizeMake(20, 20))
let maskLayer = CAShapeLayer()

maskLayer.path = path.CGPath
viewToRound.layer.mask = maskLayer

Swift 3.0バージョン:

let path = UIBezierPath(roundedRect:viewToRound.bounds,
                        byRoundingCorners:[.topRight, .bottomLeft],
                        cornerRadii: CGSize(width: 20, height:  20))

let maskLayer = CAShapeLayer()

maskLayer.path = path.cgPath
viewToRound.layer.mask = maskLayer

ここにスウィフト拡張


2
テキストフィールドで試してください。左は成功、右は失敗
Rainer Liao

10
@RainerLiao私は同じ問題がありました、私はviewDidLoadメソッドでこれをすべて行い、それを移動しviewDidAppear、それはうまくいきました。
Lucho、

これをどのデバイスでも機能するように設定するにはどうすればよいですか。これはsimulator、ストーリーボードのサイズでのみ正常に機能します。ex: if the simulator size is 6s it works fine for 6s, but not of others.どうすればこれを克服できますか。
チャナカカルデラ2016

1
Swift 3バージョンの小さな構文エラー:するpath.CGPath必要がありますpath.cgPath
Rob

@RainerLiaoビューが表示されたときにフリックさせたくない場合は、viewWillAppear代わりに変更します。これも機能します。
マシュー・ニッペン、2016

263

これは@JohnnyRockex回答のSwiftバージョンです

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, .bottomRight], radius: 10)

注意

自動レイアウトを使用している場合、最適な効果を得るには、をサブクラス化し、ビューのをUIView呼び出す必要があります。roundCornerslayoutSubviews

class View: UIView {
    override func layoutSubviews() {
        super.layoutSubviews()

        self.roundCorners([.topLeft, .bottomLeft], radius: 10)
    }
}

12
素晴らしい拡張。しかし:.TopRight.BottomRight私のために動作するようには思えません。
鬼ちゃん

4
スウィフト2view.roundCorners([.TopLeft , .BottomLeft], radius: 10)
fahrulazmi

2
ビューの境界がautolayoutでまだ適切に定義されていないため、右で機能していません...現在、同じ問題に直面しています。
dosdos 2015年

3
@dosdosサブクラスは、viewとlayoutSubviewsで自分自身の角を丸めます。
Arbitur 2015年

10
自動レイアウトを使用していて、ビューへの参照が丸めたくない場合は、を呼び出して.layoutIfNeeded()から、このメソッドを呼び出すことができます。
zgjie 2016年

209

そして最後に… iOS11にはCACornerMaskがあります!CACornerMaskそれを使うとかなり簡単に行うことができます:

let view = UIView()
view.clipsToBounds = true
view.layer.cornerRadius = 10
view.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner] // Top right corner, Top left corner respectively

1
これは間違いなく最もよく機能します。動的にサイズ変更するテーブルビューセルの端を丸める場合、他のソリューションには常に問題がありました。
cornr 2017年

2
そのソリューションを使用するには、プロジェクトがiOS 11以降をサポートしている必要があります。
エイリアン

13
@エイリアンと…私はそれを述べました。
Sergey Belous、

1
デバイスを回転させると、他の回答は機能しません。このコードは回転のために機能し、特定の角を丸めることができます。これは受け入れられる回答です。
Cloud9999Strife 2018年

1
シンプルは美しい
eharo2

99

こちらのSwiftコード例:https : //stackoverflow.com/a/35621736/308315


直接ではありません。あなたはしなければならない:

  1. を作成する CAShapeLayer
  2. に基づいて設定pathしますが、角が丸い2つだけです(おそらくを使用して)CGPathRefview.bounds+[UIBezierPath bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:]
  3. あなたの設定view.layer.maskしますCAShapeLayer

21
いくつかのビュー以外で実行すると、パフォーマンスが低下するので注意してください...
jjxtra

@jjxtraでは、パフォーマンスをあまり低下させずにそれを行うための最良の方法は何ですか?UITableViewCellに表示したいと思います。
xi.lin

@ xi.linは、layer.shouldRasterize == YESを設定すると、速度が5倍ほど向上することを覚えています。しかし、ドキュメントでは、透明でないセルで作業する場合にのみ機能すると述べています。試してみます。
codrut 2017年

64

以下は、このように実装された短いメソッドです。

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *openInMaps = [UIButton new];
    [openInMaps setFrame:CGRectMake(15, 135, 114, 70)];
    openInMaps = (UIButton *)[self roundCornersOnView:openInMaps onTopLeft:NO topRight:NO bottomLeft:YES bottomRight:NO radius:5.0];
}

- (UIView *)roundCornersOnView:(UIView *)view onTopLeft:(BOOL)tl topRight:(BOOL)tr bottomLeft:(BOOL)bl bottomRight:(BOOL)br radius:(float)radius {

    if (tl || tr || bl || br) {
        UIRectCorner corner = 0;
        if (tl) {corner = corner | UIRectCornerTopLeft;}
        if (tr) {corner = corner | UIRectCornerTopRight;}
        if (bl) {corner = corner | UIRectCornerBottomLeft;}
        if (br) {corner = corner | UIRectCornerBottomRight;}

        UIView *roundedView = view;
        UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:roundedView.bounds byRoundingCorners:corner cornerRadii:CGSizeMake(radius, radius)];
        CAShapeLayer *maskLayer = [CAShapeLayer layer];
        maskLayer.frame = roundedView.bounds;
        maskLayer.path = maskPath.CGPath;
        roundedView.layer.mask = maskLayer;
        return roundedView;
    }
    return view;
}

色の設定はどうですか?maskLayer.borderWidth = 10; maskLayer.borderColor = [UIColor redColor] .CGColor; それは私のために働いていません。
キラン2018

1
@kiranマスクには色がありません。境界線が必要な場合は、2つ目のCAShapeLayerを追加できます
Johnny Rockex

25

Swift 4.1およびXcode 9.4.1

iOSの11この一行は十分です。

detailsSubView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]//Set your view here

完全なコードを参照してください。

//In viewDidLoad
if #available(iOS 11.0, *){
        detailsSubView.clipsToBounds = false
        detailsSubView.layer.cornerRadius = 10
        detailsSubView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
} else {
      //For lower versions
}

しかし、下位バージョンの場合

let rectShape = CAShapeLayer()
    rectShape.bounds = detailsSubView.frame
    rectShape.position = detailsSubView.center
    rectShape.path = UIBezierPath(roundedRect: detailsSubView.bounds,    byRoundingCorners: [.topLeft , .topRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath
    detailsSubView.layer.mask = rectShape

完全なコードです。

if #available(iOS 11.0, *){
    detailsSubView.clipsToBounds = false
    detailsSubView.layer.cornerRadius = 10
    detailsSubView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
}else{
    let rectShape = CAShapeLayer()
    rectShape.bounds = detailsSubView.frame
    rectShape.position = detailsSubView.center
    rectShape.path = UIBezierPath(roundedRect: detailsSubView.bounds,    byRoundingCorners: [.topLeft , .topRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath
    detailsSubView.layer.mask = rectShape
}

ストーリーボードでAutoResizingを使用している場合は、このコードをviewDidLayoutSubviews()に記述します

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if #available(iOS 11.0, *){
        detailsSubView.clipsToBounds = false
        detailsSubView.layer.cornerRadius = 10
        detailsSubView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
    }else{
        let rectShape = CAShapeLayer()
        rectShape.bounds = detailsSubView.frame
        rectShape.position = detailsSubView.center
        rectShape.path = UIBezierPath(roundedRect: detailsSubView.bounds,    byRoundingCorners: [.topLeft , .topRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath
        detailsSubView.layer.mask = rectShape
    }
}

1
iOS 9では動作しませんが、11では動作します
Ali Ihsan URAL 2018

iOS 9の解決策はありますか?
jey

@jay let rectShape = CAShapeLayer()rectShape.bounds = detailsS​​ubView.frame rectShape.position = detailsS​​ubView.center rectShape.path = UIBezierPath(roundedRect:detailsS​​ubView.bounds、byRoundingCorners:[.topLeft、.topRight]、cornerRadii:CGSize(width 20、高さ:20))。cgPath detailsS​​ubView.layer.mask = rectShapeこのコードはiOS 9で機能します
iOS

@jay通知がない場合はチェックしてください
iOS

iOS 9では動作しません。コーナー部分に境界線がありません。
jey

24

iOS 11、Swift 4
そして、あなたはこのコードを試すことができます:

if #available(iOS 11.0, *) {
   element.clipsToBounds = true
   element.layer.cornerRadius = CORNER_RADIUS
   element.layer.maskedCorners = [.layerMaxXMaxYCorner]
} else {
   // Fallback on earlier versions
}

そして、あなたはテーブルビューセルでこれを使うことができます。


1
それが今日のコーディングの正しい答えです。さようなら、レイヤーをマスクします。
Alen Liang

1
これが最良の答えです。
fujianjin6471

18

これが最も簡単な答えです:

yourView.layer.cornerRadius = 8
yourView.layer.masksToBounds = true
yourView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]

iOS 11以降のソリューションであることを示すタグ
Ankur Lahiry

16

このコードを試してください、

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:( UIRectCornerTopLeft | UIRectCornerTopRight) cornerRadii:CGSizeMake(5.0, 5.0)];

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.view.bounds;
maskLayer.path  = maskPath.CGPath;

view.layer.mask = maskLayer;

15

Emma:.TopRightそして、final が計算される前に.BottomRightへの呼び出しview.roundCornersが行われたためか、おそらく機能していませんview boundsBezier Pathが呼び出されたときのビューの境界から派生することに注意してください。たとえば、自動レイアウトでビューが狭くなる場合、右側の丸い角がビューの外側にある可能性があります。viewDidLayoutSubviewsビューの境界が最終的な場所であるで呼び出してみてください。


ありがとうございました。私にとって、問題を解決したのは、viewDidLoadとviewWillAppearからviewDidAppearへの「Arbitur」によって与えられた実装への呼び出しを移動することでした。私のコントロールは最初は非表示に設定されているので、そうすることができます。
Matti

あなたが正しいです。autolayoutに問題が発生し、問題は解決しました。
Ashish Kakkad

15

Swift 4 Swift 5 1行で簡単に

使用法:

//MARK:- Corner Radius of only two side of UIViews
self.roundCorners(view: yourview, corners: [.bottomLeft, .topRight], radius: 12.0)

関数:

//MARK:- Corner Radius of only two side of UIViews
func roundCorners(view :UIView, corners: UIRectCorner, radius: CGFloat){
        let path = UIBezierPath(roundedRect: view.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        view.layer.mask = mask
}

Objective-Cの場合

使用法:

[self.verticalSeparatorView roundCorners:UIRectCornerTopLeft radius:10.0];

カテゴリで使用される関数(1つのコーナーのみ):

-(void)roundCorners: (UIRectCorner) corners radius:(CGFloat)radius {
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(radius, radius)];
        CAShapeLayer *mask = [[CAShapeLayer alloc] init];
        mask.path = path.CGPath;
        self.layer.mask = mask;
    }

ビューのコーナーは、viewDidLayoutSubviewsが完了するまで計算されないので、その内部でroundCorners funcを呼び出す必要があることに注意してください
Jirson Tavera

このビューにシャドウを追加する方法を教えてください。
Vadlapalli Masthan

@ShakeelAhmedこれは、ビューに影を追加したい場合は機能しません。
mojtaba al moussawi

最初にコーナー半径を追加してから、影を追加します
Shakeel Ahmed

10

UIViewとUITextFielsの特定のコーナーを迅速に丸めるための私の解決策は、

.layer.cornerRadius

そして

layer.maskedCorners

実際のUIViewまたはUITextFieldsの。

例:

fileprivate func inputTextFieldStyle() {
        inputTextField.layer.masksToBounds = true
        inputTextField.layer.borderWidth = 1
        inputTextField.layer.cornerRadius = 25
        inputTextField.layer.maskedCorners = [.layerMaxXMaxYCorner,.layerMaxXMinYCorner]
        inputTextField.layer.borderColor = UIColor.white.cgColor
    }

そして使用することによって

.layerMaxXMaxYCorner

そして

.layerMaxXMinYCorner

、丸めるUITextFieldの右上隅と右下隅を指定できます。

あなたはここで結果を見ることができます:

ここに画像の説明を入力してください


国境や特定のコーナーの組み合わせに最適です🎉🎉🎉
nomnom

8

スウィフト4

extension UIView {

    func roundTop(radius:CGFloat = 5){
        self.clipsToBounds = true
        self.layer.cornerRadius = radius
        if #available(iOS 11.0, *) {
            self.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]
        } else {
            // Fallback on earlier versions
        }
    }

    func roundBottom(radius:CGFloat = 5){
        self.clipsToBounds = true
        self.layer.cornerRadius = radius
        if #available(iOS 11.0, *) {
            self.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMinXMaxYCorner]
        } else {
            // Fallback on earlier versions
        }
    }
}

私の場合、あなたは私の日を節約してくれました。特定のセルの丸められたテーブルビューを作成しなければなりませんでした
Shakti

私の要件に応じて完璧なans。私はすべての答えを使いましたが、何もうまくいきませんでしたが、あなたの答えが私を助け、私の問題を解決しました。
Nikita Patil、

6

これをプログラムで行う方法は、角が丸いのUIView上部を作成することUIViewです。または、何かの下に上部を隠すことができます。


6
その非常に醜い解決策:P
Arbitur '12 / 12/14

6
    // Create the path (with only the top-left corner rounded)
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds 
                           byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight) 
                           cornerRadii:CGSizeMake(7.0, 7.0)];

// Create the shape layer and set its path
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = cell.stripBlackImnageView.bounds;
maskLayer.path = maskPath.CGPath; 
// Set the newly created shapelayer as the mask for the image view's layer
view.layer.mask = maskLayer;

4

最も簡単な方法は、角の丸いレイヤーを持つマスクを作成することです。

CALayer *maskLayer = [CALayer layer];
maskLayer.frame = CGRectMake(0,0,maskWidth ,maskHeight);
maskLayer.contents = (__bridge id)[[UIImage imageNamed:@"maskImageWithRoundedCorners.png"] CGImage];

aUIView.layer.mask = maskLayer;

そして、忘れずに:

#import <QuartzCore/QuartzCore.h>

4

すでに与えられたすべての答えは本当に良くて有効です(特に、maskプロパティを使用するユヌスの考え)。

ただし、レイヤーのサイズが頻繁に変更される可能性があるため、少し複雑なものが必要でした。つまり、毎回そのマスキングロジックを呼び出す必要があり、これは少し面倒でした。

私は迅速extensionsかつ計算されたプロパティを使用して実際のcornerRadii、レイヤーがレイアウトされたときにマスクを自動更新プロパティしました。

これはピーター・スタインバーグの素晴らしい側面を使用して達成されました、Pizzerライブラリを使用してスウィズリングを実現しました。

完全なコードはここにあります:

extension CALayer {
  // This will hold the keys for the runtime property associations
  private struct AssociationKey {
    static var CornerRect:Int8 = 1    // for the UIRectCorner argument
    static var CornerRadius:Int8 = 2  // for the radius argument
  }

  // new computed property on CALayer
  // You send the corners you want to round (ex. [.TopLeft, .BottomLeft])
  // and the radius at which you want the corners to be round
  var cornerRadii:(corners: UIRectCorner, radius:CGFloat) {
    get {
      let number = objc_getAssociatedObject(self, &AssociationKey.CornerRect)  as? NSNumber ?? 0
      let radius = objc_getAssociatedObject(self, &AssociationKey.CornerRadius)  as? NSNumber ?? 0
      return (corners: UIRectCorner(rawValue: number.unsignedLongValue), radius: CGFloat(radius.floatValue))
    }
    set (v) {
      let radius = v.radius
      let closure:((Void)->Void) = {
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: v.corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.CGPath
        self.mask = mask
      }
      let block: @convention(block) Void -> Void = closure
      let objectBlock = unsafeBitCast(block, AnyObject.self)
      objc_setAssociatedObject(self, &AssociationKey.CornerRect, NSNumber(unsignedLong: v.corners.rawValue), .OBJC_ASSOCIATION_RETAIN)
      objc_setAssociatedObject(self, &AssociationKey.CornerRadius, NSNumber(float: Float(v.radius)), .OBJC_ASSOCIATION_RETAIN)
      do { try aspect_hookSelector("layoutSublayers", withOptions: .PositionAfter, usingBlock: objectBlock) }
      catch _ { }
    }
  }
}

これを説明する簡単なブログ投稿を書きました。



2

これは、C#Xamarinを使用してボタンの各コーナーにコーナー半径を設定する方法です。

var maskPath = UIBezierPath.FromRoundedRect(MyButton.Bounds, UIRectCorner.BottomLeft | UIRectCorner.BottomRight,
    new CGSize(10.0, 10.0));
var maskLayer = new CAShapeLayer
{
    Frame = MyButton.Bounds,
    Path = maskPath.CGPath
};
MyButton.Layer.Mask = maskLayer;

2

Yunus Nedim Mehelソリューションを再利用するための素敵な拡張機能

Swift 2.3

extension UIView {
func roundCornersWithLayerMask(cornerRadii: CGFloat, corners: UIRectCorner) {
    let path = UIBezierPath(roundedRect: bounds,
                            byRoundingCorners: corners,
                            cornerRadii: CGSize(width: cornerRadii, height: cornerRadii))
    let maskLayer = CAShapeLayer()
    maskLayer.path = path.CGPath
    layer.mask = maskLayer
} }

使用法

let view = UIView()
view.roundCornersWithLayerMask(10,[.TopLeft,.TopRight])

素敵なクリーンソリューション
アグレッサー

1

コードの変更後@apinho Swift 4.3で正常に動作する

extension UIView {
func roundCornersWithLayerMask(cornerRadii: CGFloat, corners: UIRectCorner) {
    let path = UIBezierPath(roundedRect: bounds,
                            byRoundingCorners: corners,
                            cornerRadii: CGSize(width: cornerRadii, height: cornerRadii))
    let maskLayer = CAShapeLayer()
    maskLayer.path = path.cgPath
    layer.mask = maskLayer
  }
}

この機能を使用して表示するには

YourViewName. roundCornersWithLayerMask(cornerRadii: 20,corners: [.topLeft,.topRight])

0

ステファンの答えの別のバージョン。

import UIKit

    class RoundCornerView: UIView {
    var corners : UIRectCorner = [.topLeft,.topRight,.bottomLeft,.bottomRight]
        var roundCornerRadius : CGFloat = 0.0
        override func layoutSubviews() {
            super.layoutSubviews()
            if corners.rawValue > 0 && roundCornerRadius > 0.0 {
                self.roundCorners(corners: corners, radius: roundCornerRadius)
            }
        }
        private func roundCorners(corners: UIRectCorner, radius: CGFloat) {
            let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            layer.mask = mask
        }

    }

0

Swift 4.2では、次の@IBDesignableようにして作成します。

@IBDesignable

class DesignableViewCustomCorner: UIView {

    @IBInspectable var cornerRadious: CGFloat = 0 {
        didSet {
            let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(width: cornerRadious, height: cornerRadious))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            self.layer.mask = mask
        }
    }

}

0

単純な拡張

extension UIView {
    func roundCorners(corners: UIRectCorner, radius: CGFloat) {
        if #available(iOS 11, *) {
            self.clipsToBounds = true
            self.layer.cornerRadius = radius
            var masked = CACornerMask()
            if corners.contains(.topLeft) { masked.insert(.layerMinXMinYCorner) }
            if corners.contains(.topRight) { masked.insert(.layerMaxXMinYCorner) }
            if corners.contains(.bottomLeft) { masked.insert(.layerMinXMaxYCorner) }
            if corners.contains(.bottomRight) { masked.insert(.layerMaxXMaxYCorner) }
            self.layer.maskedCorners = masked
        }
        else {
            let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            layer.mask = mask
        }
    }
}

使用法:

view.roundCorners(corners: [.bottomLeft, .bottomRight], radius: 12)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.