25

境界外にあるサブビューをクリップしNSView ないようにすることは可能ですか? iOS ではclipsToBoundsUIViewnoを設定するだけNOです。しかしNSView、そのようなプロパティはありません。wantsLayermasksToBounds、を試してみましたが、これらはすべて、サブビューではなく、メソッドwantsDefaultClippingのクリッピングのみを変更するようです。drawRect

4

6 に答える 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 に答える