问题标签 [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.
ios - 使用移动框架为 CAShapeLayer 设置动画
使用核心动画层,我一直在尝试实现以下功能。在包含超层中,有两个锚层,以及连接两者的另一个层。下图应该可以清楚地说明情况。在左侧,两个橙色锚点分别标记为“A”和“B”,绿线将它们连接起来。封闭层框架使用虚线显示。在右侧,显示了我当前实现的层层次结构,其中锚点和连接都是封闭超层的子层。
现在,我要做的是让锚点四处移动,并使连接保持连接状态。我目前正在利用连接层的-setFrame:
方法更新其框架和路径属性,使用如下所示的代码:
- (void)setFrame:(CGRect)frame {
}
现在,这种工作,但问题是帧(或位置+边界)动画不与路径动画同步运行,导致连接远端暂时分离的一些抖动效果(以及其他一些小问题,大概是由相同的核心问题引起的)。
我一直在玩弄这个问题,但只是为了适度的成功。在某一时刻,我将连接的框架设置为与封闭的超层的框架相同,这确实产生了预期的效果(因为现在框架不再需要动画了)。但是,我担心此解决方案在具有多个连接的上下文中的性能 - 即。多个不透明的大尺寸重叠层看起来很糟糕?
有人会有更好、更优雅的解决方案吗?谢谢!
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 是否被触摸。该组件运行良好。但是,我对绘制条形图所采用的方法并不满意。因此这个笔记。我需要关于以下方面的专家意见
- 通过使用 CAShapeLayer 并创建 BarItems 我真的没有使用 UIGraphicsContext,这是一个好的设计吗?
- 我的方法将在 UIView 中创建几个 CALayers。根据性能,您可以在 UIView 中创建的 CALayer 的数量是否有限制。
- 如果一个好的替代方法是使用 CGContext* 方法,那么识别特定路径是否已被触及的正确方法是什么
- 从动画的角度来看,比如当你点击 Bar 时它会闪烁,是 Layer 设计更好还是 CGContext 设计更好。
非常感谢您的帮助。顺便说一句,您可以随意查看我的代码和评论。我很乐意接受任何改进的建议。
最好的,穆拉利
ios - CAShapeLayer 路径颜色变化
所以,我知道我的问题的标题可能不是最具描述性的,所以我将在这里进行介绍:
基本上我所拥有的是带有图像的视图(使用图层的内容属性),并且在该图层下我有一个绘图图层,它是一个 CAShapeLayer。在我看来,这两个图层都存在,我还有一个 CALayerDelegate,它现在只使用具有给定颜色的 CGPaths 来绘制一个点以响应点击手势(点击手势选择器调用 CAShapeLayer 上的 setNeedsDisplay)。我遇到的问题是,如果我更改颜色,然后点击查看所有以前的点自动成为新选择的颜色...不好...我需要每个子路径(即点)保持其原始颜色...也许一些代码会更清楚地说明这个主题:
委托(注意:drawingView.drawingPath 被重用):
}
还有我的点击手势识别器:
}
如果有人能告诉我我在这里做错了什么,我会欣喜若狂!:(
ios - 如何反转 CGPath 的点顺序
我想画一个圆圈,里面有一个字母。要做到这一点,我需要顺时针画圆,逆时针画字母。
这一切都很好,但是当我使用 Core Text 获得字母路径时,我无法弄清楚如何从本质上反转路径。不是镜像或旋转或任何东西......这很简单。我希望点笔画顺序是逆时针的。
这实际上非常困难。我已经完全有太多的视觉上的“差一点”错误。
iphone - 如何通过点击角来改变 CAShapeLayer 中的多边形形状?
我正在绘制一个带有 8 个角的多边形的 CAShapeLayer。我想通过一次拖动一个或多个角来改变多边形的形状。我怎样才能做到这一点?
欢呼AF
iphone - iPhone如何在armv7中使用CAShapeLayer链接错误
这可能很简单,但我以前从未使用过 CAShapeLayers,我在顶部导入了这个:
导入 < QuartzCore/QuartzCore.h >
编译器没有抱怨,但链接器出现了这个错误:
我需要导入什么才能使这项工作?,我正在使用 Xcode 4.2 并为 iPhone iOS 4.3 构建。
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
图形上下文的深度,或者是否可能。
calayer - 设置新创建的 CAShapeLayer 的正确框架
简而言之:
- Apple 不会自动为 a设置
frame
or (并且 Apple 还没有实现等效的bounds
CAShapeLayer
[UIView sizeThatFits]
- 如果您使用路径边界框的大小设置框架......一切都会出错。无论您如何尝试设置它,它都会搞砸路径
那么,以编程方式设置新创建的框架的正确方法是CAShapeLayer
什么CGPath
?苹果的文档对此事保持沉默。
我尝试过的东西不起作用:
- 创建一个
CAShapeLayer
- 创建一个
CGPath
,将其添加到图层 - 检查图层
frame
- 它是{{0,0},{0,0}}
- 放:
layer.frame = CGPathGetBoundingBox( layer.path )
帧现在是正确的,但路径现在是双偏移 - 更改
frame
导致路径有效移动额外(x,y)
像素的原因放:
layer.bounds = CGPathGetBoundingBox( layer.path )
- ......一切都疯了。没有任何意义了
- 尝试通过这样做来修复它
layer.position = CGPathGetBoundingBox( layer.path ).origin
- ...没有骰子; 还是疯了。
我尝试过的一件事确实有效,但在其他地方引起了问题:
编辑:一旦您自动旋转屏幕,就会中断。我的猜测:Apple 的自动旋转需要控制“转换”属性。
- 创建一个
CAShapeLayer
- 创建一个
CGPath
,将其添加到图层 - 检查图层的框架 - 它是
{{0,0},{0,0}}
- 放:
layer.frame = CGPathGetBoundingBox( layer.path )
- 放:
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)
”。同样,这有效 - 但它非常复杂)
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 中看不到任何可能阻止正确应用此掩码的内容。我可能做错了什么?
iphone - 如何使用子类化自定义 CALayer
在 UIView 上有许多 CALayers。每个 CALayer 由 CAShapeLayers 组成。CAShapeLayers 的路径属性由 UIBezierPath 组成。
我的目标是当我点击 CALayer 时,我想获得在 UIBezierPath 绘图中使用的点。为此,我想到了将具有 NSMutableArray 的 CALayer 子类化来存储点。当我特别绘制 CALayer 时,我会节省积分。因此,每当我点击特定的 CALayer 时,我都会获得与之相关的积分。我也想给每个 CALayer 打标签。我不知道该怎么做。
第二种方法是使用 CALayer 的内置属性,它会给我在 CALayer 中捕获的积分。但我不知道这种财产。
请分享您的想法如何完成这项任务?