20

NSView角が丸いサブクラスを作成しています。このビューはコンテナであることが意図されており、他のサブビューがそれに追加されます。の丸みを帯びた角を取得して、サブビューのすべての角もクリップしようとしていNSViewますが、取得できません。

- (void)drawRect:(NSRect)dirtyRect {
    NSRect rect = [self bounds];
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:self.radius yRadius:self.radius];
    [path addClip];

    [[NSColor redColor] set];
    NSRectFill(dirtyRect);

    [super drawRect:dirtyRect];     
}

赤はほんの一例です。rectにサブビューを追加すると、コーナーがクリップされません。 ここに画像の説明を入力してください

どうすればこれを達成できますか?

4

3 に答える 3

33

Core Animation レイヤーを使用すると、サブレイヤーが正しくクリップされます。

コンテナ NSView サブクラスで:

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.layer = _layer;   // strangely necessary
        self.wantsLayer = YES;
        self.layer.masksToBounds = YES;    
        self.layer.cornerRadius = 10.0;    
    }    
    return self;
}
于 2011-10-06T15:02:10.290 に答える
24

ユーザー定義のランタイム属性を追加してサブクラス化せずに、インターフェースビルダーでそれを行うことができます。」

ここに画像の説明を入力

于 2016-12-06T11:58:37.457 に答える
0

レイヤーでクリッピングしてみましたか?

self.layer.cornerRadius = self.radius; self.layer.masksToBounds = YES;


ああ、すみません、UIView ではなく NSView について話しているのを見逃してしまいました。ほとんどの Cocoa 標準ビューは独自のクリッピング パスを設定しているように見えるため、すべてのケースで NSView サブビューをクリッピングするのは難しいでしょう。いくつかのパディングを使用してサブビューをレイアウトし、クリッピングの必要性を回避する方が簡単な場合があります。

于 2011-02-23T10:40:07.737 に答える