Tag: uibezierpath

两个贝塞尔path形状之间的animation

我发现在两个状态之间animationUIImageView是非常棘手的:原始的矩形框架和用UIBezierPath创build的新形状。 有很多不同的技术提到,其中大部分不适合我。 首先是认识到使用UIView块animation不行; 显然不能在animateWithDuration:块中执行子图层animation。 (见这里和这里 ) 这就离开了CAAnimation ,像CABasicAnimation这样的具体子类。 我很快就意识到,不能从没有CAShapeLayer的视图(例如在这里看到)创buildanimation。 而且它们不能只是任何两个形状的层path,而是“animation形状层的path只有当你从喜欢到喜欢animation时保证工作”(见这里 ) 有了这个,就会出现更多世俗的问题,比如从fromValue和fromValue (应该是CAShapeLayer还是CGPath ?),将animation添加到( layer或mask ?)等等。 似乎有这么多的变数, 哪个组合会给我我想要的animation?

如何使用Swift / iOS来animation人类书写的中风?

目的 我正尝试使用字形生成的UIBezierPath创build人类写作的animation近似。 我明白,我已经阅读了许多类似于我的UIBezierpath问题(但不是相同的)。 我的目标是创build一个逼近人物表情的animation。 背景 我已经创build了一个操场,用来更好地理解用于animation字形的path,就好像它们是用手绘制的一样。 Apple CAShapeLayer(strokeStart和strokeEnd)中的一些概念在animation时似乎并不像预期的那样运行。 我认为,一般人们往往会像用笔具(基本上是一条直线或曲线)来思考中风。 我们认为中风和填充在一起是一条线,因为我们的书写工具不区分中风和填充。 但是,当animation时,path的轮廓由线段构成(填充分开处理,不清楚如何animation填充的位置?)。 我想要实现的是一个自然的人类书写线条/曲线,它显示了中风的开始和结束,以及随着animation从开始到结束的移动而添加的部分填充。 最初这似乎很简单,但我认为它可能需要animation的填充位置(不知道如何做到这一点),笔画开始/结束(不知道这是否需要给出意外的注意事项与animation如何执行上述),并使用的子path(如何从一个已知的path重build)。 方法1 所以,我已经考虑了Path(CGPath / UIBezierPath)的概念。 每条path实际上都包含构build字形所需的所有子path,因此可能recursion这些子path并使用CAKeyframeAnimation / CABasicAnimations和显示部分构build的子path的animation组将是一个好方法(尽pipe每个子path的填充位置和笔画仍然需要从开始到结束?)。 这种方法导致了一个精炼的问题: 如果有一个完整的UIBezierPath / CGPath,如何访问和创buildUIBezierPath / CGPath(子path)? 如何使用path/子path信息使用书写工具绘制填充和描边animation? (看起来这意味着需要同时animationCALayer的strokeStart / strokeEnd,position和path属性) 注意: 正如在代码中可以看到的那样,我确实从字形中获得了完成的path。 我可以看到path描述给了我类似于path的信息。 一个人如何获取这些信息,并将其重新组合成一个数组 子path 人可写的笔画? (这里的想法是将点信息转换成类人类笔画的新数据types,这意味着要求algorithm识别每个填充的开始,斜率,端点和边界) 提示 我已经在Pleco(一个成功实现类似algorithm的iOS应用程序)中注意到,每个笔画都是由描述可写入笔画的闭合path组成的。 UIBezierPath有一个基于连续填充的封闭path。 需要一种algorithm来改进重叠填充以为每个笔划types创build不同的闭合path。 Erica Sadun在github上有一组path实用程序 。 我还没有完全探索这些文件,但他们可能certificate有用的确定离散笔画。 UIBezierpath结构似乎基于连续线段/曲线的概念。 填充交点处出现汇合点,代表定向path变化。 是否可以计算曲线/线段的笔画/填充angular度,并search其他曲线/线条以获得相应的合stream点? (即将一条线段跨越交叉填充的间隙连接起来,以产生两条独立的path – 假设一条线路拾取点并用新的线段/曲线重新创buildpath) 内省:有一个更简单的方法吗? 我错过了一个关键的API,一本书还是更好的方法来解决这个问题? 一些替代方法(无用 – […]

在iOS中擦除绘图

我正在制作一个绘图应用程序,我有一个UIBezeirPath,用它在touchesMoved中绘制,并将其转换为CGPath,然后绘制到CGlayer, 这是我的代码 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { self.currentPath = [[DrawingPath alloc] init]; if(m_eraseButtonClicked) { [self.currentPath setPathColor:[UIColor backgroundColor]]; } else { [self.currentPath setPathColor:self.lineColor]; } CGPathRef cgPath = self.currentPath.path.CGPath; mutablePath = CGPathCreateMutableCopy(cgPath); } – (void)Erase { CGContextRef layerContext = CGLayerGetContext(self.DrawingLayer); CGContextSetBlendMode(layerContext,kCGBlendModeClear); CGContextSetLineWidth(layerContext, self.eraseWidth); CGContextBeginPath(layerContext); CGContextAddPath(layerContext, mutablePath); CGContextStrokePath(layerContext); } – (void)UndoRedoFunction { //Undo/Redo for(int i =0; i<[undoArray count];i++) […]

在iOS中绘制一个宽度可变的path

我正在写一个应用程序,我的写作工作正常,但是我想实现的是可变的笔画宽度 ,所以写作是非常现实和直观的,如“ BAMBOO ”和“ PENULTIMATE ”应用程序所做的。 首先,我想告诉你我曾经尝试过什么。 1)在iOS中,根据我的研究,它们没有压力检测或速度检测。 对于速度检测,我必须使用OPENGL。 2)由于这些限制,我尝试使用本教程中给出的方法,这是非常直接的。这里是链接http://mobile.tutsplus.com/tutorials/iphone/ios-sdk-advanced-freehand-drawing-技术/ 3)这工作正常,但是这里发生的是,随着我移动速度越来越快,越来越慢,宽度越来越大。 但是我想要的是相反的效果,就是宽度应该随着移动速度的增加而增加,当我快速移动时,厚度只能看到边缘和整个线条。 这里是BAMBOO应用程序和我的应用程序的屏幕截图。 1)BAMBOO应用程序 在上面的图片中,线条的绘制速度很快,您会看到厚度仅在边缘。 2)我的APP 在这里,你会看到这条线在边缘更薄,而其他地方更厚。 所以,这是我的疑惑 1)除了我所尝试的之外,他们是否有更好的方法来满足我的要求? 2)如果我所尝试的是正确的解决问题的方法,那么我需要做出什么样的改变才能达到预期的效果。 关心Ranjit

在不缩小内容的情况下调整精灵的大小

我用UIBezierPath创build了一个大圆圈,并使用它将其转换为Sprite, let path = UIBezierPath(arcCenter: CGPoint(x: 0, y: 0), radius: CGFloat(226), startAngle: 0.0, endAngle: CGFloat(M_PI * 2), clockwise: false) // create a shape from the path and customize it let shape = SKShapeNode(path: path.cgPath) shape.lineWidth = 20 shape.position = center shape.strokeColor = UIColor(red:0.98, green:0.99, blue:0.99, alpha:1.00) let trackViewTexture = self.view!.texture(from: shape, crop: outerPath.bounds) let trackViewSprite […]

当在animation中调用块时停止填充颜色animation闪烁

我无法弄清楚为什么我的animation块完成后,animation从fromValue闪烁到toValue。 我知道在完成一个animation之后,您必须将CALayer的值设置为animation的结束状态,以保持animation的一致性。 然而,无论我把这些方法称为什么顺序,我总是得到闪烁的结果。 我正在做的是用biezerpath画一个复选标记,然后一旦strokeEndanimation完成,我通过animationfillColor属性填充复选标记。 填充复选标记function和复位复选标记function都是在用户选中与checkmark关联的tableviewcell的行时触发的。 噢,我正在使用AutoLayout,如果这有所作为。 所以我想知道一些事情实际上是一个1)一旦表格视图单元格被显示,我调用公共函数shoudSetCheckmarkToCheckedState设置布尔self.userSelectedCheckmark参数在函数中传递的isChecked。 从那里我调用[self setNeedsLayout],它触发layoutSubviews并调用shouldDrawCheckmark …函数。 我这样做的原因是因为如果我不第一次绘制单元格,就没有框架设置,所以我的绘图看起来很乱。 所以我应该每次我改变userSelectedCheckmark属性或者有更好的方法调用setNeedsLayout。 2)一旦animation完成,为什么复选标记闪烁。 我想我知道为什么,因为当animation完成时,图层属性被重置为与图层开始animation时相同的状态。 那么我该如何解决这个问题? 我只是触发一个计时器来改变animation结束前一毫秒的填充颜色,但是这并不正确。 inheritance人的代码btw typedef void (^animationCompletionBlock)(void); #define kAnimationCompletionBlock @"animationCompletionBlock" #import "CheckmarkView.h" #import "UIColor+HexString.h" @interface CheckmarkView() @property (nonatomic,strong) CAShapeLayer *checkmarkLayer; @property (nonatomic,assign) BOOL userSelectedCheckmark; – (void)shouldDrawCheckmarkToLayerWithAnimation:(BOOL)animateCheckmark; @end @implementation CheckmarkView #pragma mark – Lifecycle /**********************/ – (id)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) […]

在Core Graphics中创build具有多个颜色段的圆

我正在试图绘制一个由相同大小的段组成的饼图,每个段都有不同的颜色。 我将我的代码放在这个SO上:在SWIFT中绘制一个圆形段的进度 let circlePath = UIBezierPath(ovalInRect: CGRect(x: 200, y: 200, width: 150, height: 150)) var segments: [CAShapeLayer] = [] let segmentAngle: CGFloat = 1.0 / CGFloat(totalSegments) for var i = 0; i < totalSegments; i++ { let circleLayer = CAShapeLayer() circleLayer.path = circlePath.CGPath // start angle is number of segments * the segment angle circleLayer.strokeStart […]

如何在UIView中绘制与MKPolyline相同的UIBezierPath

目前我正在跟踪我的位置在一个MKMapView。 我的目标是绘制一个与从追踪位置创build的MKPolyline相同的贝塞尔path。 我所尝试的是:将所有位置坐标存储在CLLocation数组中。 迭代该数组,并将经纬度坐标存储在CLLocationCoordinate2D数组中。 然后确保多段线在屏幕的视图中,然后转换CGPoints中的所有位置坐标。 当前尝试: @IBOutlet weak var bezierPathView: UIView! var locations = [CLLocation]() // values from didUpdateLocation(_:) func createBezierPath() { bezierPathView.isHidden = false var coordinates = [CLLocationCoordinate2D]() for location in locations { coordinates.append(location.coordinate) } let polyline = MKPolyline(coordinates: coordinates, count: coordinates.count) fitPolylineInView(polyline: polyline) let mapPoints = polyline.points() var points = [CGPoint]() for point […]

UIView图层上的阴影

我已经制定了一条path来掩盖我的观点: let path = // create magic path (uiview bounds + 2 arcs) let mask = CAShapeLayer() mask.path = path.cgPath view.layer.masksToBounds = false view.layer.mask = mask 到这里一切OK。 现在我想添加一个跟随path的影子,是否可能? 我尝试了几种方法,最后一个是: mask.shadowPath = path.cgPath mask.shadowColor = UIColor.red.cgColor mask.shadowOffset = CGSize(width: 10, height: 2.0) mask.shadowOpacity = 0.5 但是这会产生一个部分阴影和原始视图的颜色。 使用debugging视图层次结构 有什么build议? 最后的结果应该与此类似,但是在path上“跟随”弧的影子。

自定义button框架看起来不如Round Rect UIButton

我试图画一个自定义的button框架如下: UIBezierPath *stroke = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:RECT_CORNECR_RADIUS]; [stroke stroke]; 但由于某种原因,angular落的曲线看起来比两边思考。 如果你看看UIButton的默认框架,它是非常统一的。 A是一个UIButton,B是一个自定义button。 任何想法,我可以使它更像UIButton。