UIViewの2つの角を丸めます


83

少し前に、ビューの2つの角だけを丸めることについて質問を投稿し、すばらしい応答を得ましたが、実装に問題があります。これが私のdrawRectです:メソッド:

- (void)drawRect:(CGRect)rect {
    //[super drawRect:rect]; <------Should I uncomment this?
    int radius = 5;
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextBeginPath(context);
    CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + rect.size.height - radius, radius, M_PI, M_PI / 2, 1);
    CGContextAddArc(context, rect.origin.x + rect.size.width - radius, rect.origin.y + rect.size.height - radius, radius, M_PI / 2, 0.0f, 1);
    CGContextClosePath(context);
    CGContextClip(context);
}

メソッドが呼び出されていますが、ビューの結果に影響を与えていないようです。なぜ何かアイデアはありますか?

回答:


104

CACornerMaskは、ビュー層に右下に、TOPLEFTを定義するためにどの助け、iOSの11で導入topright、bottomleft。以下は使用例です。

ここでは、2つの上部コーナーのみを丸めようとします。

myView.clipsToBounds = true
myView.layer.cornerRadius = 10
myView.layer.maskedCorners = [.layerMinXMinYCorner,.layerMaxXMinYCorner]

参考までに参照:


これは、今これを行う慣用的な方法のように見えます。いいキャッチ!
Jumhyn

3
ビューの幅/高さは、コーナー半径の少なくとも2倍である必要があります。そうしないと、奇妙なアーティファクトが表示されます。たとえば、下の角だけを丸め、半径を20、高さを30だけにすると、セルが目に見えて狭くなります(1ピクセルまたは2ピクセル)。
GrahamPerks18年

あなたのビューが( -私の場合のように、原因拡大UITextViewに可能そのフレームを変更した場合、これは正しい方法であることに注意してくださいstackoverflow.com/questions/50926215/...)。UIBezierPathを設定すると、フレームが変更されても自動的に更新されません。
thomers 2018年

iOS 11以降でのみ利用可能であることに注意してくださいif #available(iOS 11.0, *) { }
Tri NgoMinh19年

2
素晴らしい答え。に設定clipsToBoundsするtrue必要はありません。あなたはコーナーをマスクしたときに層に影を追加することができますclipsToBoundsですfalse。重宝しました。
AuRis20年

72


私の知る限り、サブビューもマスクする必要がある場合は、CALayerマスキングを使用できます。これを行うには2つの方法があります。最初のものはもう少しエレガントで、2番目のものは回避策です:-)しかしそれはまた速いです。どちらもCALayerマスキングに基づいています。私は昨年、いくつかのプロジェクトで両方の方法を使用しましたが、何か役立つものが見つかることを願っています。

解決策1

まず、この関数を作成して、UIImage必要な丸い角を持つイメージマスク()をオンザフライで生成しました。この関数には、基本的に5つのパラメーターが必要です。画像の境界と4つのコーナー半径(左上、右上、左下、右下)です。


static inline UIImage* MTDContextCreateRoundedMask( CGRect rect, CGFloat radius_tl, CGFloat radius_tr, CGFloat radius_bl, CGFloat radius_br ) {  

    CGContextRef context;
    CGColorSpaceRef colorSpace;

    colorSpace = CGColorSpaceCreateDeviceRGB();

    // create a bitmap graphics context the size of the image
    context = CGBitmapContextCreate( NULL, rect.size.width, rect.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast );

    // free the rgb colorspace
    CGColorSpaceRelease(colorSpace);    

    if ( context == NULL ) {
        return NULL;
    }

    // cerate mask

    CGFloat minx = CGRectGetMinX( rect ), midx = CGRectGetMidX( rect ), maxx = CGRectGetMaxX( rect );
    CGFloat miny = CGRectGetMinY( rect ), midy = CGRectGetMidY( rect ), maxy = CGRectGetMaxY( rect );

    CGContextBeginPath( context );
    CGContextSetGrayFillColor( context, 1.0, 0.0 );
    CGContextAddRect( context, rect );
    CGContextClosePath( context );
    CGContextDrawPath( context, kCGPathFill );

    CGContextSetGrayFillColor( context, 1.0, 1.0 );
    CGContextBeginPath( context );
    CGContextMoveToPoint( context, minx, midy );
    CGContextAddArcToPoint( context, minx, miny, midx, miny, radius_bl );
    CGContextAddArcToPoint( context, maxx, miny, maxx, midy, radius_br );
    CGContextAddArcToPoint( context, maxx, maxy, midx, maxy, radius_tr );
    CGContextAddArcToPoint( context, minx, maxy, minx, midy, radius_tl );
    CGContextClosePath( context );
    CGContextDrawPath( context, kCGPathFill );

    // Create CGImageRef of the main view bitmap content, and then
    // release that bitmap context
    CGImageRef bitmapContext = CGBitmapContextCreateImage( context );
    CGContextRelease( context );

    // convert the finished resized image to a UIImage 
    UIImage *theImage = [UIImage imageWithCGImage:bitmapContext];
    // image is retained by the property setting above, so we can 
    // release the original
    CGImageRelease(bitmapContext);

    // return the image
    return theImage;
}  

これで、数行のコードが必要になります。私はviewControllerviewDidLoadメソッドに何かを入れました。それはより高速だからですが、例UIViewlayoutSubviewsメソッドを使用してカスタムでも使用できます。



- (void)viewDidLoad {

    // Create the mask image you need calling the previous function
    UIImage *mask = MTDContextCreateRoundedMask( self.view.bounds, 50.0, 50.0, 0.0, 0.0 );
    // Create a new layer that will work as a mask
    CALayer *layerMask = [CALayer layer];
    layerMask.frame = self.view.bounds;       
    // Put the mask image as content of the layer
    layerMask.contents = (id)mask.CGImage;       
    // set the mask layer as mask of the view layer
    self.view.layer.mask = layerMask;              

    // Add a backaground color just to check if it works
    self.view.backgroundColor = [UIColor redColor];
    // Add a test view to verify the correct mask clipping
    UIView *testView = [[UIView alloc] initWithFrame:CGRectMake( 0.0, 0.0, 50.0, 50.0 )];
    testView.backgroundColor = [UIColor blueColor];
    [self.view addSubview:testView];
    [testView release];

    [super viewDidLoad];
}

解決策2

この解決策はもう少し「汚い」です。基本的に、必要な丸い角(すべての角)でマスクレイヤーを作成できます。次に、コーナー半径の値だけマスクレイヤーの高さを増やす必要があります。このようにして、下部の丸い角は非表示になり、上部の丸い角のみが表示されます。コードはviewDidLoad高速であるためメソッドにのみ配置しましたが、例UIViewlayoutSubviewsメソッドを使用してカスタムでも使用できます。

  

- (void)viewDidLoad {

    // set the radius
    CGFloat radius = 50.0;
    // set the mask frame, and increase the height by the 
    // corner radius to hide bottom corners
    CGRect maskFrame = self.view.bounds;
    maskFrame.size.height += radius;
    // create the mask layer
    CALayer *maskLayer = [CALayer layer];
    maskLayer.cornerRadius = radius;
    maskLayer.backgroundColor = [UIColor blackColor].CGColor;
    maskLayer.frame = maskFrame;

    // set the mask
    self.view.layer.mask = maskLayer;

    // Add a backaground color just to check if it works
    self.view.backgroundColor = [UIColor redColor];
    // Add a test view to verify the correct mask clipping
    UIView *testView = [[UIView alloc] initWithFrame:CGRectMake( 0.0, 0.0, 50.0, 50.0 )];
    testView.backgroundColor = [UIColor blueColor];
    [self.view addSubview:testView];
    [testView release];

    [super viewDidLoad];
}

お役に立てれば。チャオ!


ついに働いた!本当にありがとう!一方が他方よりも優れている点は何ですか?
Jumhyn 2011

とにかく、CAShapeLayerソリューションでさえ完璧です。UIBezierPath(3.2以降が必要)を使用するか、CGPathメソッド(CGPathMoveToPoint、CGPathAddQuadCurveToPointなど)を使用してCGPathを描画できます
lomanf 2011

1
ポートレートからランドスケープに回転した後、マスクのサイズを自動変更するにはどうすればよいですか?
chourobin 2011年

layer.masksToBounds = YESを追加することを忘れないでください
Dmitry Salnikov 2013

どうすれば右上隅と右下隅だけを丸めることができますか?
PLOW 2016

69

いくつかの回答とコメントをくまなく調べてみるUIBezierPath bezierPathWithRoundedRectCAShapeLayer、最も簡単で簡単な方法を使用していることがわかりました。非常に複雑なケースには適さないかもしれませんが、ときどき角を丸める場合は、高速でスムーズに機能します。

マスクの適切なコーナーを設定する簡略化されたヘルパーを作成しました。

-(void) setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners
{
    UIBezierPath* rounded = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(10.0, 10.0)];

    CAShapeLayer* shape = [[CAShapeLayer alloc] init];
    [shape setPath:rounded.CGPath];

    view.layer.mask = shape;
}

これを使用するには、適切なUIRectCorner列挙型で呼び出すだけです。例:

[self setMaskTo:self.photoView byRoundingCorners:UIRectCornerTopLeft|UIRectCornerBottomLeft];

私の場合、グループ化されたUITableViewCellの写真の角を丸めるために使用します。必要に応じて値を変更する必要がある場合は、半径10.0で問題なく機能します。

編集:これと非常によく似た以前の回答に注意してくださいリンク)。必要に応じて、この回答を追加の便利な関数として引き続き使用できます。


編集: Swift3のUIView拡張機能と同じコード

extension UIView {
    func maskByRoundingCorners(_ masks:UIRectCorner, withRadii radii:CGSize = CGSize(width: 10, height: 10)) {
        let rounded = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: masks, cornerRadii: radii)

        let shape = CAShapeLayer()
        shape.path = rounded.cgPath

        self.layer.mask = shape
    }
}

それを使用するには、次のmaskByRoundingCornerいずれかを呼び出すだけUIViewです。

view.maskByRoundingCorners([.topLeft, .bottomLeft])

境界線を追加しながらこれは可能ですか?
unome 2015

2
私は一つだけのコーナーが丸みを帯びてしまったのでDispatchQueue.main.async {}への関数呼び出しを入れていた...
マクシムKniazev

1
@MaksimKniazevはい、これはメイン(UI)スレッドから呼び出す必要があります。このルールは、UIに触れるすべてのアクションに適用されます。メインスレッドから呼び出す必要があります。そうしないと、奇妙なことが起こる可能性があります。
PL

1
片隅だけが丸くなっているようです。@MaksimKniazevソリューションを試しても機能しませんでした。
gustavo_fringe 2018年

@Gustavo_fringeと同じ問題があり、右上隅がxibビュー内の境界にクリップ/マスクされていない(サイズ変更されている)が、まだ修正方法がわからない。
Cyber​​Mew

57

@lomanfの回答へのコメントにこれをすべて収めることはできませんでした。だから私はそれを答えとして追加しています。

@lomanfが言ったように、サブレイヤーがパスの境界の外に描画されないように、レイヤーマスクを追加する必要があります。ただし、今ははるかに簡単です。iOS 3.2以降をターゲットにしている限り、クォーツで画像を作成してマスクとして設定する必要はありません。あなたは、単に作成することができますCAShapeLayerUIBezierPathし、マスクとしてそれを使用します。

また、レイヤーマスクを使用する場合は、マスクを追加するときに、マスクするレイヤーがレイヤー階層の一部になっていないことを確認してください。それ以外の場合、動作は定義されていません。ビューがすでに階層内にある場合は、ビューをスーパービューから削除し、マスクしてから、元の場所に戻す必要があります。

CAShapeLayer *maskLayer = [CAShapeLayer layer];
UIBezierPath *roundedPath = 
  [UIBezierPath bezierPathWithRoundedRect:maskLayer.bounds
                        byRoundingCorners:UIRectCornerTopLeft |
                                          UIRectCornerBottomRight
                              cornerRadii:CGSizeMake(16.f, 16.f)];    
maskLayer.fillColor = [[UIColor whiteColor] CGColor];
maskLayer.backgroundColor = [[UIColor clearColor] CGColor];
maskLayer.path = [roundedPath CGPath];

//Don't add masks to layers already in the hierarchy!
UIView *superview = [self.view superview];
[self.view removeFromSuperview];
self.view.layer.mask = maskLayer;
[superview addSubview:self.view];

Core Animationレンダリングの動作方法により、マスキングは比較的遅い操作です。各マスクには、追加のレンダリングパスが必要です。したがって、マスクは慎重に使用してください。

このアプローチの最良の部分の1つは、カスタムを作成してUIViewオーバーライドする必要がなくなったことですdrawRect:。これにより、コードがより単純になり、おそらくさらに高速になるはずです。


有望なようですが、ビューが表示されません。なぜ何かアイデアはありますか?
Jumhyn 2011

10
maskLayer.boundsを使用してUIBezierPathのサイズを設定していますが、境界の値はCGRectZeroです。maskLayer.frame = self.view.bounds;のように、コードの2行目を(CAShapeLayerの初期化の直後に)追加する必要があります。
lomanf 2011

1
はい、あなたが正しい。シェイプレイヤーがすでに存在する別の例からそのコードを抽出しました。申し訳ありません。
Nathan Eror 2011

それは完璧に動作します!上記のように、maskLayer.frame = self.view.boundsを追加すると、makeは機能します。それ以外の場合、ビューは表示されません。
ダニエルリベイロ

+1これは非常にうまく機能します。実際、私はこの方法をlomanfの#2ソリューションよりも好むと思います。この方法では、反対側のコーナーに円弧を簡単に追加でき(例:右上+左下)、lomanfの最初のソリューションよりも確かに短くなります。素晴らしいコードネイサン!
freeAsInBeer 2013年

30

Nathanの例を取り上げてUIView、DRYの原則に準拠できるようにするためのカテゴリを作成しました。難しい話は抜きにして:

UIView + Roundify.h

#import <UIKit/UIKit.h>

@interface UIView (Roundify)

-(void)addRoundedCorners:(UIRectCorner)corners withRadii:(CGSize)radii;
-(CALayer*)maskForRoundedCorners:(UIRectCorner)corners withRadii:(CGSize)radii;

@end

UIView + Roundify.m

#import "UIView+Roundify.h"

@implementation UIView (Roundify)

-(void)addRoundedCorners:(UIRectCorner)corners withRadii:(CGSize)radii {
    CALayer *tMaskLayer = [self maskForRoundedCorners:corners withRadii:radii];
    self.layer.mask = tMaskLayer;
}

-(CALayer*)maskForRoundedCorners:(UIRectCorner)corners withRadii:(CGSize)radii {
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = self.bounds;

    UIBezierPath *roundedPath = [UIBezierPath bezierPathWithRoundedRect:
        maskLayer.bounds byRoundingCorners:corners cornerRadii:radii];
    maskLayer.fillColor = [[UIColor whiteColor] CGColor];
    maskLayer.backgroundColor = [[UIColor clearColor] CGColor];
    maskLayer.path = [roundedPath CGPath];

    return maskLayer;
}

@end

電話するには:

[myView addRoundedCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight
                withRadii:CGSizeMake(20.0f, 20.0f)];

2
<QuartzCore / QuatzCore.h>を.mファイルにインポートし、QuartzCore.frameworkをプロジェクトに追加することを忘れないでください
DEzra 2013年

+1すばらしいものですが、1つの質問ですが、ビューをスーパービューに削除/再読み込みする目的は何ですか?
eladleb 2013

@eladleb:ここでの基本的なコードはNathanからのもので、私はそれを少し最適化しただけです。私が行った調査から、レイヤーマスクを適用する前にビューを削除する正当な理由を見つけることができません。したがって、そのコードは省略しても安全だと思います。
freeAsInBeer 2013

@FreeAsInBeer -私は、これは実際にビューのzオーダーを変更し、より多くの問題を作成することができます...そして、私はそれを取り除くために投票したい、同意
eladleb

TableViewに丸みを帯びた角を追加する際に発生していた問題を解決しました。ヘッダー、丸みを帯びたトゥープコーナー、丸みを帯びた下部角を持つフッターを追加しました。ありがとう。
2015年

24

PLの答えを少し拡張するために、特定のオブジェクトをUIButton正しく丸めないようにメソッドを書き直しました。

- (void)setMaskTo:(id)sender byRoundingCorners:(UIRectCorner)corners withCornerRadii:(CGSize)radii
{
    // UIButton requires this
    [sender layer].cornerRadius = 0.0;

    UIBezierPath *shapePath = [UIBezierPath bezierPathWithRoundedRect:[sender bounds]
                                                byRoundingCorners:corners
                                                cornerRadii:radii];

    CAShapeLayer *newCornerLayer = [CAShapeLayer layer];
    newCornerLayer.frame = [sender bounds];
    newCornerLayer.path = shapePath.CGPath;
    [sender layer].mask = newCornerLayer;
}

そしてそれを

[self setMaskTo:self.continueButton byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight withCornerRadii:CGSizeMake(3.0, 3.0)];

12

Swiftでそれを実行したい場合は、の拡張子を使用できますUIView。そうすることで、すべてのサブクラスが次のメソッドを使用できるようになります。

import QuartzCore

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

使用例:

self.anImageView.roundCorner(.topRight, radius: 10)

3

受け入れられた回答を拡張して、下位互換性を追加しましょう。iOS 11より前では、view.layer.maskedCornersは使用できません。だから私たちはこのようにすることができます

if #available(iOS 11.0, *) {
    myView.layer.maskedCorners = [.layerMinXMinYCorner,.layerMaxXMinYCorner]
} else {
    myView.maskByRoundingCorners([.topLeft, .topRight])
}

extension UIView{
    func maskByRoundingCorners(_ masks:UIRectCorner, withRadii radii:CGSize = CGSize(width: 10, height: 10)) {
        let rounded = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: masks, cornerRadii: radii)

        let shape = CAShapeLayer()
        shape.path = rounded.cgPath

        self.layer.mask = shape
    }
}

コードの再利用を改善するために、UIView拡張機能としてmaskByRoundingCornersを記述しました。

@SachinVsSachinと@PLへのクレジット:)私はそれをより良くするためにそれらのコードを組み合わせました。


2
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(5, 5, self.bounds.size.width-10, self.bounds.size.height-10)
                                               byRoundingCorners:UIRectCornerAllCorners
                                                     cornerRadii:CGSizeMake(12.0, 12.0)];

必要に応じて「AllCorners」を変更してください。


では、これをUIViewで実行する必要がありますか、それともUIViewControllerで実行できますか?UIBezierPathを作成したら、それをどうしますか?ありがとう。
StoneBreaker 2012年

2

提供されるすべてのソリューションが目標を達成します。しかし、UIConstraints時々これを爆破することができます。

たとえば、下の角を丸くする必要があります。高さまたは下部の間隔の制約が丸める必要のあるUIViewに設定されている場合、角を丸めるコードスニペットをviewDidLayoutSubviewsメソッドに移動する必要があります 。

ハイライト:

UIBezierPath *maskPath = [UIBezierPath
    bezierPathWithRoundedRect:roundedView.bounds byRoundingCorners:
    (UIRectCornerTopRight | UIRectCornerBottomRight) cornerRadii:CGSizeMake(16.0, 16.0)];

上記のコードスニペットは、このコードがで設定されてviewDidLoadいる場合にのみ右上隅を丸めます。roundedView.bounds制約が更新された後に変更されるためですUIView



1

コードから始めて、以下のスニペットのようなものを使用する場合があります。

これがあなたが求めているような結果であるかどうかはわかりません。また、システムがdrawRect:を呼び出す場合、また、rectの一部のみを再描画するように要求すると、これは非常に奇妙な動作をすることに注意してください。上記のネバンのアプローチは、より良い方法かもしれません。

 // make sure the view's background is set to [UIColor clearColor]
- (void)drawRect:(CGRect)rect
{
    CGFloat radius = 10.0;
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextTranslateCTM(context, rect.size.width/2, rect.size.height/2);
    CGContextRotateCTM(context, M_PI); // rotate so image appears right way up
    CGContextTranslateCTM(context, -rect.size.width/2, -rect.size.height/2);

    CGContextBeginPath(context);

    CGContextMoveToPoint(context, rect.origin.x, rect.origin.y);
    CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + rect.size.height - radius, radius, M_PI, M_PI / 2, 1);
    CGContextAddArc(context, rect.origin.x + rect.size.width - radius, rect.origin.y + rect.size.height - radius, radius, M_PI / 2, 0.0f, 1);
    CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y);
    CGContextClip(context); 

    // now do your drawing, e.g. draw an image
    CGImageRef anImage = [[UIImage imageNamed:@"image.jpg"] CGImage];
    CGContextDrawImage(context, rect, anImage);    
}

角が丸いビューを作成しましたが、サブビューをクリップすることはできません。ビューの端に四角い角のあるビューを配置すると、それでもスーパービューの丸い角が覆われます。なぜこれが起こっているのか考えはありますか?
Jumhyn 2011

クリッピングは、-drawRect:描画しているビューにのみ影響するためです。そのサブビューは、描画が完了した後に独立して描画されます。
Jonathan Grynspan 2011

1

少しハックですが、これに対する比較的単純な(サブクラス化、マスキングなどのない)方法は、2つのUIViewを持つことです。両方ともclipToBounds = YES。子ビューに丸みを帯びた角を設定し、親ビュー内に配置して、まっすぐにしたい角がトリミングされるようにします。

UIView* parent = [[UIView alloc] initWithFrame:CGRectMake(10,10,100,100)];
parent.clipsToBounds = YES;

UIView* child = [[UIView alloc] new];
child.clipsToBounds = YES;
child.layer.cornerRadius = 3.0f;
child.backgroundColor = [UIColor redColor];
child.frame = CGRectOffset(parent.bounds, +4, -4);


[parent addSubView:child];

対角線上にある2つの角を丸くしたい場合はサポートしていません。


1

ベジェパスは答えです。追加のコードが必要な場合は、これでうまくいきました:https://stackoverflow.com/a/13163693/936957

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

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;
_backgroundImageView.layer.mask = maskLayer;
[maskLayer release];

1

UIBezierPathソリューション。

- (void) drawRect:(CGRect)rect {

    [super drawRect:rect];

    //Create shape which we will draw. 
    CGRect rectangle = CGRectMake(2, 
                                  2, 
                                  rect.size.width - 4,
                                  rect.size.height - 4);

    //Create BezierPath with round corners
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:rectangle 
                                                   byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight 
                                                         cornerRadii:CGSizeMake(10.0, 10.0)];

    //Set path width
    [maskPath setLineWidth:2];

    //Set color
    [[UIColor redColor] setStroke];

    //Draw BezierPath to see it
    [maskPath stroke];
}

0

これは、いくつかのものが正しく設定されている場合にのみ機能します。

  1. ClipsToBoundsはYESに設定する必要があります
  2. 不透明はNOでなければなりません
  3. backgroundColorは「clearColor」である必要があります(これについては完全にはわかりません)
  4. drawRectは頻繁に呼び出されないため、contentModeは「UIContentModeRedraw」である必要があります。
  5. [super drawRect:rect]は、CGContextClipの後に呼び出す必要があります
  6. ビューに任意のサブビューが含まれていない可能性があります(これについては不明です)
  7. ドローレクトをトリガーするには、必ず「needsDisplay:」を少なくとも1回設定してください。

0

UITableViewの上部の2つの角を丸めようとしていることはわかっていますが、何らかの理由で、次の方法を使用するのが最善の解決策であることがわかりました。

self.tableView.layer.cornerRadius = 10;

プログラム的には四隅すべてを丸める必要がありますが、何らかの理由で上位2つだけを丸めます。**上記で作成したコードの効果を確認するには、下のスクリーンショットをご覧ください。

これがお役に立てば幸いです。

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


1
それは、すべての角を丸めていない場合はUITableView、次に行っているコードの別の場所に存在する必要がありますUITableView下に丸みを帯びた角を持っていない、または多分UIViewまたはUILabelそれがの下の部分をカバーしていますUITableView
Josh Valdivieso 2015年

-1

おそらく限界までクリップする必要があります。行を追加します

self.clipsToBounds = YES

そのプロパティを設定するコードのどこかに。

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