首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用elementCount和elementAtIndex使UIBezierPath更像NSBezierPath

在这个问答内容中,我们可以看到两个方法:elementCountelementAtIndex。这两个方法都是用于处理路径对象的方法,其中 elementCount 用于获取路径中元素的数量,而 elementAtIndex 用于获取路径中指定索引的元素。

在 UIBezierPath 和 NSBezierPath 中,这两个方法的功能是相似的,但是它们的实现方式有所不同。UIBezierPath 是 iOS 和 OS X 中的一个类,用于绘制和处理路径对象,而 NSBezierPath 是 macOS 中的一个类,用于绘制和处理路径对象。

为了使 UIBezierPath 更像 NSBezierPath,我们可以使用以下方法:

  1. 创建一个 UIBezierPath 的子类,并在其中实现 elementCountelementAtIndex 方法。
  2. 在子类中,使用 UIBezierPath 的 CGPath 属性来获取路径对象,并使用 Core Graphics 框架中的 CGPathApply 函数来遍历路径对象。
  3. elementCount 方法中,使用 CGPathApply 函数来计算路径中元素的数量。
  4. elementAtIndex 方法中,使用 CGPathApply 函数来获取路径中指定索引的元素。

以下是一个示例代码:

代码语言:swift
复制
import UIKit

class CustomUIBezierPath: UIBezierPath {
    var elements: [UIBezierPathElement] = []

    override init() {
        super.init()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func move(to point: CGPoint) {
        super.move(to: point)
        elements.append(.moveTo(point))
    }

    override func addLine(to point: CGPoint) {
        super.addLine(to: point)
        elements.append(.lineTo(point))
    }

    override func addCurve(to endPoint: CGPoint, controlPoint1: CGPoint, controlPoint2: CGPoint) {
        super.addCurve(to: endPoint, controlPoint1: controlPoint1, controlPoint2: controlPoint2)
        elements.append(.curveTo(endPoint, controlPoint1: controlPoint1, controlPoint2: controlPoint2))
    }

    override func addQuadCurve(to endPoint: CGPoint, controlPoint: CGPoint) {
        super.addQuadCurve(to: endPoint, controlPoint: controlPoint)
        elements.append(.quadCurveTo(endPoint, controlPoint: controlPoint))
    }

    override func close() {
        super.close()
        elements.append(.close)
    }

    func elementCount() -> Int {
        return elements.count
    }

    func elementAtIndex(_ index: Int) -> UIBezierPathElement? {
        if index< elements.count {
            return elements[index]
        }
        return nil
    }
}

这样,我们就可以使用 elementCountelementAtIndex 方法来获取 UIBezierPath 中的元素数量和指定索引的元素,使其更像 NSBezierPath。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

精解四大集合框架:List核心知识总结

集合类主要从 Collection Map 两个根接口派生出来,比如常用的 ArrayList、LinkedList、HashMap、HashSet、ConcurrentHashMap 等等。...oldValue; } 检查指定位置是否在数组范围内,假如数组长度是 2,则 index 必须 >=0 并且 < 2; 保留要删除的值,因为最后需要返回旧的值; 计算出需要移动元素个数,再通过拷贝使数组内位置为...//方便GC elementData[--size] = null; } 遍历数组,比较obejct是否存在于数组中; 计算出需要移动元素个数,再通过拷贝使数组内位置为...+ 1); elementData[elementCount++] = e; return true; } 这几个常用方法中,方法都是使用同步锁synchronized...Stack 继承于 Vector,所以 Vector 拥有的属性功能,Stack 都拥有,比如 add()、set() 等等。

32140

Java集合源码分析(三)VevtorStack

2)在本文中,使用的是方法锁。   ...是线程安全就搞错了,具体分析在下面会说     4)Vector是一个线程安全的类,如果使用需要线程安全就使用Vector,如果不需要,就使用arrayList     5)VectorArrayList...二、Vector源码分析 2.1、继承结构层次关系 ? ?   我们发现Vector的继承关系层次结构ArrayList中的一模一样,不懂的可以去前面的博客查看!...= Object[].class) elementData = Arrays.copyOf(elementData, elementCount, Object[].class);...1)fail-fast     快速失败,例如在arrayList中使用迭代器遍历时,有另外的线程对arrayList的存储数组进行了改变,比如add、delete、等使之发生了结构上的改变,

58560

老司机带你走进Core Animation 之图层的透视、渐变及复制

CATransform3DIdentity 生成一个无任何变换的默认矩阵,可用于使变换后的Layer恢复初始状态 ---- CATransform3DMakeTranslation CATransform3DMakeScale...值得注意的是,以上两个旋转api中x/y/z三个参数均为指定旋转轴,可选值01,0代表此轴不做旋转,1代表作旋转。...本身CATransformLayer不具有任何其他属性,其实他更像是一个容器。它本身至渲染其子图层,自身没有任何layer的属性。...最重要的一点是,当图层加入到CATransformLayer中以后,hitTestconvertPoint两个方法就失效了,请注意这点。...- (void)viewDidLoad { [super viewDidLoad]; UIBezierPath * path = [UIBezierPath bezierPathWithArcCenter

72340

UI篇-UIResponder之事件传递响应精析

然后我们依次点击A、B视图看下hitTes调用顺序是否预期一致 ? 点击AView ?...前一个方法使应用程序完全停止接收触摸事件消息,第二个方法则重启消息的接收。某些时候,当您的代码正在执行动画时,可能希望关闭事件的传递。...我们在使用UITextViewUITextField的时候,可以通过它们的inputAccessoryView属性给输入时呼出的键盘加一个附属视图,通常是UIToolBar,用于回收键盘。...设置其颜色为橙色,高度为200,并设置 self.layer.cornerRadius = 100; self.clipsToBounds = YES; 2.在pointInside中创建一个 UIBezierPath...- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { UIBezierPath * path = [UIBezierPath

2.4K30

iOS图形处理概论:OpenGL ES,Metal,Core Graphics,Core Image,GPUImage,Scene Kit (3D) ,Sprite Kit (2D),OpenCV

UIKit包括UIBezierPath(绘制线、角度、椭圆及其它图形)、UIImage(显示图像)、UIColor(颜色操作)、UIFontUIScreen(提供字体屏幕信息)等类以及在位图图形环境...EAGL是一个Objective-C API,提供使OpenGL ES与Core AnimationUIKIT集成的接口。...为了创建全屏幕的视图或使OpenGL ES内容与UIKit视图集成,可以使用GLKit。在使用GLKit时,GLKit提供的类GLKView类本身实现呈现目标及创建和维护一个framebuffer。...CAEAGLLayer 为了使OpenGL ES内容作为一个Core Animation层的部分内容时,可以使用CAEAGLLayer 作为呈现目标,并需要另外创建framebuffer以及自己实现控制整个绘制流程...这些新技术有助于使游戏角色的动作更加自然,并让开发者可以更轻松地在游戏中加入力场、检测碰撞生成新的灯光效果。

3.4K41

iOS QQ 基础动画组件

粒子拥有与重力、碰撞、推力交互相关的属性。粒子支持PNG、lottie动画的播放(为提高性能,此处使用rlottie,原因分析见动画预研文章),后续如有必要可扩展APNG/PAG等格式。...此处借助于重写QQGravity2DBody中- (UIDynamicItemCollisionBoundsType)collisionBoundsType- (UIBezierPath *)collisionBoundingPath...这里遇到一个问题,如何简单表示粒子的轮廓,思考后提出一种较为简单的思路,通过宽、高圆角来实现矩形、圆角矩形、圆椭圆等轮廓。经过多次使用发现,这种简单的思路作用很大!...很好的使用于基于此动画的已上线需求中。这种较为精确的轮廓计算效果表现为单层的平铺效果,为模拟真实,可将碰撞轮廓设置与真实轮廓不一致,构造一种多层的效果。这是一种较为巧妙的实现方式。...3.4 粒子路径 为了使粒子路径由2个因素决定:外力(含重力、碰撞与推力)与速度,包括大小方向。为了更好适应多变的业务诉求,每个粒子都提供了一个脉冲型的推力作用,作为粒子运动的初始状态。

75120

ARKit+Swift 版本的机器学习算法 k-NN

kNN-Swift-2.png k.png ARKit-KNN-2.png 维基介绍 在模式识别领域中,最近邻居法(KNN算法,又译K-近邻算法)是一种用于分类回归的非参数统计方法[1]。...K-NN是一种基于实例的学习,或者是局部近似将所有计算推迟到分类之后的惰性学习。k-近邻算法是所有的机器学习算法中最简单的之一。...无论是分类还是回归,衡量邻居的权重都非常有用,使较近邻居的权重比较远邻居的权重大。例如,一种常见的加权方案是给每个邻居权重赋值为1/ d,其中d是到邻居的距离。...使用 alpha 表示预测类别,以预测样本为中心画一个圈,圈内为最近的 k 个样本。...r = self.radius + radius let kNNCircleLayer = CAShapeLayer() kNNCircleLayer.path = UIBezierPath

71300

iOS学习——核心动画

CAAnimation是所有动画对象的父类,实现CAMediaTiming协议,负责控制动画的时间、速度时间曲线等等,是一个抽象类,不能直接使用。...3、 简单使用CoreAnimation的步骤 使用CoreAnimation做动画的时候,遵循四步就好 创建CAAnmation子对象,因为CAAnmation是抽象类,所以一般要使用自具体子类,就是上面说的五类...它kCAMediaTimingFunctionEaseInEaseOut的区别很难察觉,可能是苹果觉得它对于隐式动画来说更适合(然后对UIKit就改变了想法,而是使用kCAMediaTimingFunctionEaseInEaseOut...fillMode主要有四种类型: kCAFillModeForwards :动画开始之后layer的状态将保持在动画的最后一帧,而removedOnCompletion的默认属性值是 YES,所以为了使动画结束之后...*path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 300, 400)]; anim.path = path.CGPath

1.1K50

“Jupyter的杀手”:Netflix发布新开发工具Polynote

数据科学或者机器学习行业需要更好的工具来编写代码,进行实验算法可视化数据,Polynote 就是这些人的福利。 ? Polynote 更像一个简版的 IDE 而非加强版的 REPL ?...Polynote 致力于使 notebook 工作起来更像 IDE 或像 VS Code 这样的代码编辑器。它支持更好的代码自动填充功能,整理功能,富文本编辑器 LaTex 支持。...更好的语法突出显示代码自动填充功能看上去微不足道,但是这些小的改进却会一直伴随着您的开发,并使您更加专注于实际的任务。...可重复性代码 简而言之,Polynote 并未使用旧的 REPL 模型执行代码, 它使用自己的代码解释器。...因此,单元格的位置在 Polynote 的执行语义中很重要,从而使用户可以从上至下地阅读 notebook 。 这种感觉似乎更像是在编写脚本而不是 notebook。

74930

谷歌DeepMind最新研究:对抗性攻击对人类也有效,人类AI都会把花瓶认成猫!

例如,攻击可以有针对性地使AI模型将花瓶归类为猫,或者是除花瓶之外的任何东西。 上图展示了对抗性攻击的过程(为了便于人类观察,中间的随机扰动做了一些夸张)。...而由于对抗性攻击,模型以高置信度将受到干扰的两幅图像进行错误分类,分别为「猫」「卡车」。 接下来,向人类参与者展示这两张图片,并提出了一个有针对性的问题:哪张图片更像猫?...最上面的一对图像受到微妙的扰动,最大幅度为2个像素,导致神经网络将它们分别错误地分类为「卡车」「猫」。(志愿者被问到「哪个更像猫?」)...对真实类别T的图像进行了对抗性扰动,通过对扰动进行优化,使ANN倾向于将图像错误分类为A。参与者被要求在TA之间做出强制选择。...上面的实验1使用了简短的遮蔽演示,以限制原始图像类别(主要信号)对反应的影响,从而揭示对对抗性扰动(从属信号)的敏感性。

14210
领券