如何将 NSBezierPath 附加到 CAShapeLayer

2024-01-05

我想知道是否有人可以帮忙。基本上我下面有一些 Objective C 代码,有谁知道如何将其附加到 Mac OS X 而不是 iOS 的 CAShapeLayer 上?


****//// Color Declarations
NSColor* fillColor = [NSColor colorWithCalibratedRed: 0 green: 0.886 blue: 0.886 alpha: 1];
NSColor* strokeColor = [NSColor colorWithCalibratedRed: 0 green: 0 blue: 0 alpha: 1];
//// Star Drawing
NSBezierPath* starPath = [NSBezierPath bezierPath];
[starPath moveToPoint: NSMakePoint(106, 91.5)];
[starPath lineToPoint: NSMakePoint(110.21, 82.56)];
[starPath lineToPoint: NSMakePoint(119.18, 86.7)];
[starPath lineToPoint: NSMakePoint(116.65, 77.15)];
[starPath lineToPoint: NSMakePoint(126.19, 74.56)];
[starPath lineToPoint: NSMakePoint(118.11, 68.86)];
[starPath lineToPoint: NSMakePoint(123.75, 60.75)];
[starPath lineToPoint: NSMakePoint(113.91, 61.58)];
[starPath lineToPoint: NSMakePoint(113.01, 51.74)];
[starPath lineToPoint: NSMakePoint(106, 58.7)];
[starPath lineToPoint: NSMakePoint(98.99, 51.74)];
[starPath lineToPoint: NSMakePoint(98.09, 61.58)];
[starPath lineToPoint: NSMakePoint(88.25, 60.75)];
[starPath lineToPoint: NSMakePoint(93.89, 68.86)];
[starPath lineToPoint: NSMakePoint(85.81, 74.56)];
[starPath lineToPoint: NSMakePoint(95.35, 77.15)];
[starPath lineToPoint: NSMakePoint(92.82, 86.7)];
[starPath lineToPoint: NSMakePoint(101.79, 82.56)];
[starPath closePath];
[fillColor setFill];
[starPath fill];
[strokeColor setStroke];
[starPath setLineWidth: 1];
[starPath stroke];****

基本上,我使用应用程序 Paintcode 并希望创建形状,然后将它们转换为用于制作动画的 CAShapeLayer。

任何帮助将不胜感激。

Regards.


CAShapeLayer的路径属性是CGPathRef,但是,与 iOS 不同[UIBezierPath CGPath],令人惊讶的是没有任何内置方法来转换 OSXNSBezierPath to a CGPathRef。然而,在苹果文档中,他们发布了一个片段来进行转换https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/CocoaDrawingGuide/Paths/Paths.html#//apple_ref/doc/uid/TP40003290-CH206-SW2 https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/CocoaDrawingGuide/Paths/Paths.html#//apple_ref/doc/uid/TP40003290-CH206-SW2:

@implementation NSBezierPath (BezierPathQuartzUtilities)
// This method works only in OS X v10.2 and later.
- (CGPathRef)quartzPath
{
    int i, numElements;

    // Need to begin a path here.
    CGPathRef           immutablePath = NULL;

    // Then draw the path elements.
    numElements = [self elementCount];
    if (numElements > 0)
    {
        CGMutablePathRef    path = CGPathCreateMutable();
        NSPoint             points[3];
        BOOL                didClosePath = YES;

        for (i = 0; i < numElements; i++)
        {
            switch ([self elementAtIndex:i associatedPoints:points])
            {
                case NSMoveToBezierPathElement:
                    CGPathMoveToPoint(path, NULL, points[0].x, points[0].y);
                    break;

                case NSLineToBezierPathElement:
                    CGPathAddLineToPoint(path, NULL, points[0].x, points[0].y);
                    didClosePath = NO;
                    break;

                case NSCurveToBezierPathElement:
                    CGPathAddCurveToPoint(path, NULL, points[0].x, points[0].y,
                                        points[1].x, points[1].y,
                                        points[2].x, points[2].y);
                    didClosePath = NO;
                    break;

                case NSClosePathBezierPathElement:
                    CGPathCloseSubpath(path);
                    didClosePath = YES;
                    break;
            }
        }

        // Be sure the path is closed or Quartz may not do valid hit detection.
        if (!didClosePath)
            CGPathCloseSubpath(path);

        immutablePath = CGPathCreateCopy(path);
        CGPathRelease(path);
    }

    return immutablePath;
}
@end

您可以粘贴到此类别中,然后使用以下命令在图层上设置形状:

layer.path = [starPath quartzPath];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 NSBezierPath 附加到 CAShapeLayer 的相关文章

随机推荐

  • 鉴于所有调用都是异步的,如何在 lambda 中构建顺序 AWS 服务调用?

    我有 Java 背景 所以对 Lambda 所需的 Javascript 约定有点新手 我有一个 lambda 函数 它旨在按照特定顺序执行多个 AWS 任务 具体取决于前一个任务的结果 鉴于每个任务都异步报告其结果 我想知道是否有正确的方
  • 在android中过滤ListView时检查了错误的项目

    我有一个带有多项选择条目的 ListView 其中一些条目从一开始就使用进行检查 setItemChecked position true 我将其与过滤选项结合起来 setTextFilterEnabled true 因此很容易在列表中找到
  • 无法找到 Java 运行时 Android Studio Robolectric

    我已将 Robolectric 添加到 Android 项目中 我在 19 0 1 中使用带有构建工具的 Android Studio 我可以运行测试 gradlew test 哪个执行得很好 如果我尝试 gradle installDeb
  • Artifactory 大型下载失败

    我的连续传奇 I have Artifactory 专业版 5 8 4运行在CentOS 7 4使用 Artifactory 内置的系统Nginx作为反向代理的服务 大多数时候 在下载大对象时 连接失败 此外 在失败的连接中传输的最后几千字
  • 我可以在 XtraGrid 上将行单元格值设置为只读吗?

    如何在 XtraGrid 上使特定行单元格只读 不可编辑 例如 仅适用于 row 0 但不是所有行 您可以使用GridView CustomRowCellEdit http documentation devexpress com Wind
  • 警告:您将留下 1 个提交,未连接到任何分支

    Egit再次出击 我犯了一个错误 试图切换到 EGit 中的另一个分支 结果不知何故搞砸了 没有检查到任何分支 然后我对这个非分支进行了提交 然后当我意识到我没有跟踪正确的分支时 我运行了以下命令 git checkout issue2 W
  • css 标签的 html head 之间的有效区别?:@import url 与 link href

    之间是否存在有效差异 and 浏览器的行为是否有所不同 w3c等推荐什么 您应该使用的原因有几个代替 import 其中 2 个是 Using import可能会导致下载方式出现意外的排序 The import可能会导致空白白屏问题 htt
  • 嵌套宏扩展

    我不确定这是否是正确使用的术语 但是我的问题是宏调用 PLUGIN NAME 作为另一个宏调用 IMPLMENT MODULE 的参数 这反过来将其打印为字符串 打印该参数作为宏调用 somePLUGIN NAME 而不是扩展结果 some
  • 将 MySQL 查询结果显示为每行 HTML 表

    我尝试搜索 但没有找到任何对我有帮助的内容 所以我创建了一个新线程 我有一个包含多个列的 MySQL 数据库 每行都是一个项目的一组单独的数据 现在我已经设法将其显示得非常接近我想要的内容 但是为了获得更好的视图 我需要将其格式化为两列表
  • 从 MainMenu 获取特定菜单项

    我有一个包含窗口的笔尖 winA xib 我的应用程序委托包含一个名为 WinAController 的 NSWindowController 子类 WinAController 有一个属性 NSMenu mainMenu 我想将其指向Ma
  • 如何在react-slick轮播中执行slickNext方法?

    我有以下带有 Slick 轮播的 React 应用程序 我创建了一个自定义的 下一步 按钮 需要执行slickNext 方法继续到下一张幻灯片 Slick 轮播文档和一些问题的答案都提到了以下调用方式slickNext method 问题是
  • 在 Mac 10.9.5 上安装 PyCrypto 时出错

    我正在尝试为 Python 3 4 安装 PyCrypto 但 C 编译的程序出现问题 它说 错误 无法运行C编译的程序 有人知道如何修复它吗 code running build running build py running buil
  • 包含/排除 gulp.src 的 glob

    我正在尝试为我的 javascript concat 构建任务设置一个 glob 数组gulp 目录结构如下 about about js assets contact core navbar navbar js navbar test j
  • 使用 Gitlab 管道和 git 推送防止无限循环

    我有一个项目 其中有 4 个环境 开发 测试 暂存和生产 每个环境都有分支 分别是开发 测试 暂存主机 我们用npm version插入版本package json还要添加一个 git 标签 之后我们运行构建并成功后 我们推送由npm ve
  • ValueError:没有足够的值来解压(预期为 2,实际为 1)

    以下是我的代码 views py from django shortcuts import render from forms import MedicineForm from models import Medicine def inde
  • 将点击事件绑定到td vs table

    我想在 HTML 中构建类似 excel 的实用程序 假设我的 table id myTbl 有 20 行和 20 列 每当用户单击它并使用 td 文本作为其值时 我想在 td 内添加文本框 Suppose my table is 我有两个
  • 调用非托管函数 char 返回 char *

    我在非托管 C C 代码 dll 中有一个函数 它返回包含 char 数组的结构 我创建了 C 结构体来接收调用该函数时的返回值 调用此函数后 我得到 System Runtime InteropServices MarshalDirect
  • 如何仅在父元素中应用变换?

    我有 HTML div style color white height 1080px width 100 div class player controls a class right carousel control href span
  • 转换为 Web 应用程序错误 - 无法解析 aspx 文件

    我偶尔会在我的 aspx 文件中遇到错误 这些错误是由设计器文件的问题引起的 发生这种情况时 我删除设计器文件 右键单击 aspx 文件并选择 转换为 Web 应用程序 通常重新生成设计器文件效果很好 但有时我会收到一个错误 简单地说 无法
  • 如何将 NSBezierPath 附加到 CAShapeLayer

    我想知道是否有人可以帮忙 基本上我下面有一些 Objective C 代码 有谁知道如何将其附加到 Mac OS X 而不是 iOS 的 CAShapeLayer 上 Color Declarations NSColor fillColor