【问题标题】:How to add shadow to NSView如何给 NSView 添加阴影
【发布时间】:2013-06-30 20:44:17
【问题描述】:

我花了一些时间试图弄清楚如何为NSView 添加阴影。目前,我正在尝试使用NSShadow 类来完成此操作。我的代码如下。我试图在NSView 子类的自定义初始化方法中创建阴影。无论我尝试什么,都不会出现阴影。

NSShadow *dropShadow = [[NSShadow alloc] init];
[dropShadow setShadowColor:[NSColor blackColor]];

[self setWantsLayer:YES];
[self setShadow:dropShadow];

编辑

这是我尝试使用CALayer 的方法。

self.layer.shadowOffset = CGSizeMake(10, 10);
self.layer.shadowOpacity = 1.0;
self.layer.shadowRadius = 10.0;
self.layer.shadowPath = [self quartzPathFromBezierPath:[NSBezierPath bezierPathWithRect:frame]];

quartzPathFromBezierPath:NSBezierPath 转换为CGPath

【问题讨论】:

  • 您是否尝试过在 Interface Builder 中查看效果检查器?

标签: objective-c macos cocoa nsview nsshadow


【解决方案1】:

将此与偏移量一起使用,并且需要设置其他参数

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
    NSShadow *dropShadow = [[NSShadow alloc] init];
    [dropShadow setShadowColor:[NSColor redColor]];
    [dropShadow setShadowOffset:NSMakeSize(0, -10.0)];
    [dropShadow setShadowBlurRadius:10.0];

    [self setWantsLayer: YES];
    [self setShadow: dropShadow];

    [dropShadow release];
}

return self;
}

【讨论】:

    【解决方案2】:

    NSShadow 的替代方法是获取视图层并使用其阴影相关属性。特别是,请务必将 shadowOpacity 设置为大于 0(默认值)的值。

    注意不能同时使用阴影偏移和阴影路径。

    【讨论】:

    • 查看quartzPathFromBezierPath 返回的内容,为什么不直接向贝塞尔曲线询问其路径?
    • 我认为你不能直接向NSBezierPath 询问CGPath(即使你可以询问UIBezierPath)。我在 Apple 的网站上找到了 quartzPathFromBezierPath: 的源代码。你会怎么做呢?
    • 好吧,我看错了类名。您是否将视图或图层设置为剪辑到边界?
    【解决方案3】:

    尝试关注这个答案,Here

    我认为最重要的一行是self.view.superview?.wantsLayer = true

    【讨论】:

      猜你喜欢
      • 2018-07-19
      • 2015-10-23
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多