问题标签 [cashapelayer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2421 浏览

ios - 使用移动框架为 CAShapeLayer 设置动画

使用核心动画层,我一直在尝试实现以下功能。在包含超层中,有两个锚层,以及连接两者的另一个层。下图应该可以清楚地说明情况。在左侧,两个橙色锚点分别标记为“A”和“B”,绿线将它们连接起来。封闭层框架使用虚线显示。在右侧,显示了我当前实现的层层次结构,其中锚点和连接都是封闭超层的子层。连接的核心动画层方案

现在,我要做的是让锚点四处移动,并使连接保持连接状态。我目前正在利用连接层的-setFrame:方法更新其框架和路径属性,使用如下所示的代码:

- (void)setFrame:(CGRect)frame {

}

现在,这种工作,但问题是帧(或位置+边界)动画不与路径动画同步运行,导致连接远端暂时分离的一些抖动效果(以及其他一些小问题,大概是由相同的核心问题引起的)。

我一直在玩弄这个问题,但只是为了适度的成功。在某一时刻,我将连接的框架设置为与封闭的超层的框架相同,这确实产生了预期的效果(因为现在框架不再需要动画了)。但是,我担心此解决方案在具有多个连接的上下文中的性能 - 即。多个不透明的大尺寸重叠层看起来很糟糕?

有人会有更好、更优雅的解决方案吗?谢谢!

0 投票
1 回答
5132 浏览

ios - CALayer vs CGContext,哪个设计方法更好?

我一直在做一些iOS绘图的实验。为了做一个实践练习,我编写了一个 BarChart 组件。下面是类图(好吧,我不允许上传图片)所以让我用文字写出来。我有一个继承自 UIView 的 NGBarChartView,它有 2 个协议 NGBarChartViewDataSource 和 NGBarChartViewDelegate。代码位于https://github.com/mraghuram/NELGPieChart/blob/master/NELGPieChart/NGBarChartView.m

为了绘制 barChart,我将每个 barChart 创建为不同的 CAShapeLayer。我这样做的原因有两个,首先我可以创建一个 UIBezierPath 并将其附加到一个 CAShapeLayer 对象和两个,我可以通过使用 [Layer hitTest] 方法轻松跟踪 barItem 是否被触摸。该组件运行良好。但是,我对绘制条形图所采用的方法并不满意。因此这个笔记。我需要关于以下方面的专家意见

  1. 通过使用 CAShapeLayer 并创建 BarItems 我真的没有使用 UIGraphicsContext,这是一个好的设计吗?
  2. 我的方法将在 UIView 中创建几个 CALayers。根据性能,您可以在 UIView 中创建的 CALayer 的数量是否有限制。
  3. 如果一个好的替代方法是使用 CGContext* 方法,那么识别特定路径是否已被触及的正确方法是什么
  4. 从动画的角度来看,比如当你点击 Bar 时它会闪烁,是 Layer 设计更好还是 CGContext 设计更好。

非常感谢您的帮助。顺便说一句,您可以随意查看我的代码和评论。我很乐意接受任何改进的建议。

最好的,穆拉利

0 投票
1 回答
1709 浏览

ios - CAShapeLayer 路径颜色变化

所以,我知道我的问题的标题可能不是最具描述性的,所以我将在这里进行介绍:

基本上我所拥有的是带有图像的视图(使用图层的内容属性),并且在该图层下我有一个绘图图层,它是一个 CAShapeLayer。在我看来,这两个图层都存在,我还有一个 CALayerDelegate,它现在只使用具有给定颜色的 CGPaths 来绘制一个点以响应点击手势(点击手势选择器调用 CAShapeLayer 上的 setNeedsDisplay)。我遇到的问题是,如果我更改颜色,然后点击查看所有以前的点自动成为新选择的颜色...不好...我需要每个子路径(即点)保持其原始颜色...也许一些代码会更清楚地说明这个主题:

委托(注意:drawingView.drawingPath 被重用):

}

还有我的点击手势识别器:

}

如果有人能告诉我我在这里做错了什么,我会欣喜若狂!:(

0 投票
2 回答
1897 浏览

ios - 如何反转 CGPath 的点顺序

我想画一个圆圈,里面有一个字母。要做到这一点,我需要顺时针画圆,逆时针画字母。

这一切都很好,但是当我使用 Core Text 获得字母路径时,我无法弄清楚如何从本质上反转路径。不是镜像或旋转或任何东西......这很简单。我希望点笔画顺序是逆时针的。

这实际上非常困难。我已经完全有太多的视觉上的“差一点”错误。

0 投票
1 回答
247 浏览

iphone - 如何通过点击角来改变 CAShapeLayer 中的多边形形状?

我正在绘制一个带有 8 个角的多边形的 CAShapeLayer。我想通过一次拖动一个或多个角来改变多边形的形状。我怎样才能做到这一点?

欢呼AF

0 投票
1 回答
3234 浏览

iphone - iPhone如何在armv7中使用CAShapeLayer链接错误

这可能很简单,但我以前从未使用过 CAShapeLayers,我在顶部导入了这个:

导入 < QuartzCore/QuartzCore.h >

编译器没有抱怨,但链接器出现了这个错误:

我需要导入什么才能使这项工作?,我正在使用 Xcode 4.2 并为 iPhone iOS 4.3 构建。

0 投票
0 回答
997 浏览

iphone - 如何在图层前面而不是后面绘制 NSString(使用 drawInRect)?

在我看来initWithFrame,我创建了一个根层,然后向它添加一个子层。我设置了子图层的路径,所以它会绘制一个彩色框。我想让文本出现在框的顶部,所以在我的视图中drawRect,我使用 NSString 的drawInRect方法来呈现文本,但它总是绘制在框的后面。

有没有办法改变深度以某种方式在彩色框层前面绘制文本?

图片:http: //i.imgur.com/zins6.png

子层不透明度低:http: //i.imgur.com/qyJLU.png

我已经尝试将 CATextLayer 添加到子层 - 它可以工作,但速度较慢(每个视图都在 UITableViewCell 中,并且使用 NSString drawInRect 方法滚动得更平滑)。

那么有人知道我可以在子层顶部绘制字符串的方法吗?我尝试将子图层的 z 位置设置得更低,但没有任何效果。我不确定如何更改drawRect图形上下文的深度,或者是否可能。

0 投票
1 回答
4346 浏览

calayer - 设置新创建的 CAShapeLayer 的正确框架

简而言之:

  1. Apple 不会自动为 a设置frameor (并且 Apple 还没有实现等效的boundsCAShapeLayer[UIView sizeThatFits]
  2. 如果您使用路径边界框的大小设置框架......一切都会出错。无论您如何尝试设置它,它都会搞砸路径

那么,以编程方式设置新创建的框架的正确方法是CAShapeLayer什么CGPath?苹果的文档对此事保持沉默。

我尝试过的东西不起作用:

  1. 创建一个CAShapeLayer
  2. 创建一个CGPath,将其添加到图层
  3. 检查图层frame- 它是{{0,0},{0,0}}
  4. 放:layer.frame = CGPathGetBoundingBox( layer.path )
  5. 帧现在是正确的,但路径现在是双偏移 - 更改frame导致路径有效移动额外(x,y)像素的原因

  6. 放:layer.bounds = CGPathGetBoundingBox( layer.path )

  7. ......一切都疯了。没有任何意义了
  8. 尝试通过这样做来修复它layer.position = CGPathGetBoundingBox( layer.path ).origin
  9. ...没有骰子; 还是疯了。

我尝试过的一件事确实有效,但在其他地方引起了问题:

编辑:一旦您自动旋转屏幕,就会中断。我的猜测:Apple 的自动旋转需要控制“转换”属性。

  1. 创建一个CAShapeLayer
  2. 创建一个CGPath,将其添加到图层
  3. 检查图层的框架 - 它是{{0,0},{0,0}}
  4. 放:layer.frame = CGPathGetBoundingBox( layer.path )
  5. 放:layer.transform = CGAffineTransformMakeTranslation( CGPathGetBoundingBox( layer.path ).origin.x * -1, // same for y-coord: set it to "-1 * the path's origin

这可行,但是......许多第 3 方代码假定 a 的初始转换CALayer是身份。

不应该这么难!当然,我在这里做错了什么?

(我有一个建议:“每次添加路径时,手动运行自定义函数以将所有点移动-1 * (top-left-point.x, top-left-point.y)”。同样,这有效 - 但它非常复杂)

0 投票
1 回答
462 浏览

ios - 正确屏蔽 CALayers

我正在使用 TapkuLibrary 在其他方面非常出色的TKCalendarDayEventView,并尝试像StuDev 在这里演示的那样有选择地绕过视图中的一个角。不幸的是,应用 StuDev 的代码片段会导致 EventView 完全从其包含的 TKCalendarDayTimelineView 中消失。我在当前代码下方添加此代码片段

+ (id)eventViewWithFrame:(CGRect)frame id:(NSNumber *)id startDate:(NSDate *)startDate endDate:(NSDate *)endDate title:(NSString *)title location:(NSString *)location;

方法。我已经注释掉了在代码中设置边框宽度、颜色或半径的代码。我已确保 TKCalendarDayEventView 没有任何超级层,因为苹果文档警告不要向具有超级层的层添加蒙版:

将遮罩设置为新图层时,必须先将新图层的超图层设置为 nil,否则行为未定义。

我也尝试过使用 maskLayer 的 backgroundColor 和 fillColor 属性。我在 TKCalendarDayEventView 中看不到任何可能阻止正确应用此掩码的内容。我可能做错了什么?

0 投票
1 回答
1802 浏览

iphone - 如何使用子类化自定义 CALayer

在 UIView 上有许多 CALayers。每个 CALayer 由 CAShapeLayers 组成。CAShapeLayers 的路径属性由 UIBezierPath 组成。

我的目标是当我点击 CALayer 时,我想获得在 UIBezierPath 绘图中使用的点。为此,我想到了将具有 NSMutableArray 的 CALayer 子类化来存储点。当我特别绘制 CALayer 时,我会节省积分。因此,每当我点击特定的 CALayer 时,我都会获得与之相关的积分。我也想给每个 CALayer 打标签。我不知道该怎么做。

第二种方法是使用 CALayer 的内置属性,它会给我在 CALayer 中捕获的积分。但我不知道这种财产。

请分享您的想法如何完成这项任务?