境界外にあるサブビューをクリップしNSView
ないようにすることは可能ですか? iOS ではclipsToBounds
、UIView
noを設定するだけNO
です。しかしNSView
、そのようなプロパティはありません。wantsLayer
、masksToBounds
、を試してみましたが、これらはすべて、サブビューではなく、メソッドwantsDefaultClipping
のクリッピングのみを変更するようです。drawRect
質問する
12779 次
6 に答える
15
この辺りの挙動が変わったようです。ビューのレイヤーを境界にマスクしないように設定するだけです。
view.wantsLayer = true
view.layer?.masksToBounds = false
于 2018-11-06T16:44:23.310 に答える
7
wantsDefaultClipping
サブビューをオーバーライドして return にすることで、これを解決できましたNO
。
于 2013-07-22T17:20:27.143 に答える
5
自動レイアウトを使用している場合は、オーバーライドalignmentRectInsets
してクリッピング領域を拡張し、配置用の四角形よりも大きくします。この例では、すべての辺に 50 のスペースが与えられます。
override var alignmentRectInsets: NSEdgeInsets {
return NSEdgeInsets(top: 50.0, left: 50.0, bottom: 50.0, right: 50.0)
}
于 2016-03-08T19:44:03.460 に答える
0
wantDefaultClipping メソッドは機能します... 親と子の両方で、wantDefaultClipping をオーバーライドする必要があります。
ただし、そのルートに行くと、自分で後片付けが面倒です。
テキストを NSProgressBar に添付するための私のソリューションは次のとおりです。
BGHUDAppKit と stackoverflow に感謝
@implementation BGHUDOverlayTextField
- (BOOL) wantsDefaultClipping { return NO; } // thanks stackoverflow.com
@end
@interface BGHUDProgressIndicator : NSProgressIndicator {
NSBezierPath *progressPath;
NSString *themeKey;
NSString *LayerKey;
BGHUDOverlayTextField *customTitleField;
BOOL hiding;
}
@implementation BGHUDProgressIndicator
- (BOOL) wantsDefaultClipping { return (customTitleField == nil); } // thanks stackoverflow.com
- (void) setCustomTitle: (NSMutableAttributedString *)iTitle
{
if ( !customTitleField )
{
NSRect r = [self bounds];
r.size.height += 10;
customTitleField = [[BGHUDOverlayTextField alloc] initWithFrame:r];
[self addSubview: customTitleField];
}
[customTitleField setAttributedStringValue:iTitle];
}
- (void)setHidden:(BOOL)flag
{
if ( customTitleField && flag && !hiding )
{
hiding = YES;
NSRect fr = [self bounds];
NSRect eraseFr = fr;
eraseFr.size = [customTitleField frame].size;
[self displayRectIgnoringOpacity:fr];
}
else if ( !flag )
hiding = NO;
[super setHidden:flag];
}
- (void) drawRect: (NSRect)fr
{
if ( customTitleField )
{
fr = [self bounds];
NSRect eraseFr = fr;
eraseFr.size = [customTitleField frame].size;
[[NSColor normalSolidFill] set];
NSRectFill( eraseFr );
if ( hiding )
{
[customTitleField setAttributedStringValue:nil];
NSRectFill( eraseFr );
return;
}
[NSGraphicsContext saveGraphicsState];
NSRectClip(fr);
}
[super drawRect:fr];
if ( customTitleField )
{
[NSGraphicsContext restoreGraphicsState];
}
}
于 2013-11-15T01:09:43.200 に答える