我正试图在核心图形中斜切路径.有没有人已经为任意形状做过这个,如果是这样,他们是否愿意共享代码?
我在下面列出了我的实现.我用三个变量来确定伞:CGFloat bevelSize,UIColor highlightColor,UIColor shadow.请注意,光源的角度始终为135度.我还没有完成这个,但这里基本上是我要做的,分成两部分.第一部分,产生焦点:
产生焦点的目的是按比例"缩小"形状.
第二部分有点复杂.我必须创建斜面形状的每个边/部分.我这样做是通过bevelSize沿着从最近的焦点延伸到所讨论的点的线的半径来绘制(由)原始形状的每个点.当我有两个连续的'bevelPoints'时,我创建了一个UIBezierPath,它从bevelPoints延伸到原始点并返回到bevelPoints(注意,这包括弧).这会创建一个我可以用来填充的"边/段".在直边,我只是填充阴影或高光颜色,取决于侧面的角度.对于弧,我确定弧度'弧'.如果该弧包含一个过渡角(M_PI_4或M_PI + M_PI_4),我用渐变填充它(从阴影到高光或高亮到阴影,这是合适的).否则我用纯色填充它.
更新
我把我的答案(见下文)分成了一个单独的博文.我不再使用您在上面看到的实现细节,但我将其全部保留在那里以供参考.我希望这可以帮助其他人使用Core Graphics.
我正在编写一个iPad应用程序,我在其中渲染表示形状的XML对象到屏幕上的图形.我试图渲染的对象之一是弧.基本上这些弧为我提供了一个边界矩形以及一个开始和结束角度.
给定属性:
使用这些值,我需要绘制弧(基本上是椭圆的一部分).我不能使用以下内容:
UIBezierPath *arc = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(x, y, width, height)];
[UIColor blackColor] setStroke];
[arc stroke];
Run Code Online (Sandbox Code Playgroud)
因为它绘制了一个完整的椭圆.基本上我需要上面但是它需要考虑开始和结束角度,因此只显示椭圆的一部分.我认为这将涉及绘制三次贝塞尔曲线或二次贝塞尔曲线.问题是我不知道如何用我给出的信息计算起点,终点或控制点.
我一直在寻找一个小时的答案,但很难找到关于这个主题的任何内容.
我有一个与Objective-c相关的问题.我正在制作一个应用程序,其中UIView检查来自用户的触摸,如果用户触摸并移动他/她的手指,则绘制使用UIBezierPath的路径.如果用户绘制以使路径自身相交,则它应从屏幕上消失.当用户完成绘制图案时,路径中最后一个点的一条线应自动连接到路径中的第一个点(我正在使用方法"closePath"),如果此线与另一个"线"相交"在路径中,路径也应该从屏幕上消失.
我将每个触摸点存储在CGPoint中,我将其存储在另一个名为Line的类中作为A点和B点.然后我将"line"保存到名为"lines"的NSMutableArray中.每次将一个点添加到路径时,我都会检查该点与它之前绘制的点之间的线是否与行中的任何"行"相交( - (BOOL)checkLineIntersection:(CGPoint)p1 :(CGPoint)p2:(CGPoint)p3:(CGPoint)p4)我从本教程中获得"http://www.iossourcecode.com/2012/08/02/how-to-make-a-game-like-切的绳部分-2 /".
问题
问题是,当我运行应用程序时,它有时会起作用,但有时当我绘制时,线条与路径相交并不会消失.我无法弄清楚为什么......当我慢慢画画时,似乎更常见.
代码:
MyView.h:
#import <UIKit/UIKit.h>
#import "Line.h"
@interface MyView : UIView {
NSMutableArray *pathArray;
UIBezierPath *myPath;
NSMutableArray *lines;
Line *line;
}
@end
Run Code Online (Sandbox Code Playgroud)
MyView.m:
#import "MyView.h"
@implementation MyView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
pathArray=[[NSMutableArray alloc]init];
}
return self;
}
- (void)drawRect:(CGRect)rect
{
[[UIColor redColor] setStroke];
[[UIColor blueColor] setFill];
for (UIBezierPath *_path in pathArray) {
//[_path fill];
[_path strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
}
}
#pragma mark - Touch …Run Code Online (Sandbox Code Playgroud) 我试图让这个绘制一条平移手势发生的线.问题是当我尝试使用此代码时
var firstPoint: CGPoint!
var path: UIBezierPath!
@IBAction func panned(gesture: UIPanGestureRecognizer) {
switch gesture.state {
case .Began: firstPoint = gesture.locationOfTouch(0, inView: view)
case .Ended: gesture.cancelsTouchesInView = true
case .Changed:
path.moveToPoint(firstPoint)
path.addLineToPoint(gesture.translationInView(view))
path.stroke()
default: break
}
}
Run Code Online (Sandbox Code Playgroud)
...我得到了多个错误,我不太清楚该怎么做.
Apr 2 17:40:03 MacBook-Pro.local Paint[6729] <Error>: CGContextSaveGState: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is …Run Code Online (Sandbox Code Playgroud) 我是使用UIBezierPaths绘制形状的新手.到目前为止我发现的所有示例都涉及首先对视图进行子类化,然后重写drawRect:方法并在其中进行绘制,但是我无法找到任何绝对确定的说明这是否是绘制UIBezierPaths的唯一方法在UIView中,或者如果这只是最实用的方式.
有没有其他方法(除了调配)在UIView中绘制UIBezierPath而不进行子类化?
下面我有附加图像,我想实现下面的动画.我尝试过水波动画,但不知道如何像上面那样控制动画.
我必须CAShapeLayer在其中实现此动画.

初始代码
UIBezierPath *leftPath = [UIBezierPath bezierPath];
// Set the starting point of the shape.
[leftPath moveToPoint:CGPointMake(0,self.bounds.size.height/2)];
// Draw the lines.
[leftPath addLineToPoint:CGPointMake(0,self.bounds.size.height/2)];
[leftPath addLineToPoint:CGPointMake(self.bounds.size.width,self.bounds.size.height/2)];
leftLayer.path = leftPath.CGPath;
leftLayer.strokeColor = [[UIColor whiteColor] CGColor];
leftLayer.fillColor = nil;
leftLayer.borderWidth = 3.0f;
leftLayer.lineCap = kCALineCapRound;
leftLayer.lineJoin = kCALineJoinRound;
leftLayer.borderColor=[UIColor blackColor].CGColor;
[self.layer addSublayer:leftLayer];
Run Code Online (Sandbox Code Playgroud)
动画代码
-(void)animateCureve{
CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"path"];
pathAnimation.duration = 3.5;
pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
pathAnimation.fromValue = (id)leftLayer.path;
pathAnimation.toValue = (id)[self wavePath].CGPath;
pathAnimation.removedOnCompletion=NO;
[leftLayer addAnimation:pathAnimation forKey:@"path"];
}
Run Code Online (Sandbox Code Playgroud)
曲线路径
- …Run Code Online (Sandbox Code Playgroud) 我使用以下代码创建了一个矩形,现在我需要舍入这个矩形的角.但是我找不到一个名为layer.cornerRadius的属性,有人可以帮帮我吗?
class OvalLayer: CAShapeLayer {
let animationDuration: CFTimeInterval = 0.3
override init() {
super.init()
fillColor = Colors.green.CGColor
path = ovalPathSmall.CGPath
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
var ovalPathStart: UIBezierPath {
let path = UIBezierPath(ovalInRect: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))
return path
}
}
Run Code Online (Sandbox Code Playgroud) 我在我的类中有这两个函数,它们扩展了 CAShapeLayer,但是每次我绘制路径时都无法得到带有圆形端盖的弧。它看起来总是这样的图片:
我已经尝试使用 kCALineCapRound 没有成功。有任何想法吗?
self.lineShape.lineCap = kCALineCapRound;
self.lineShape.lineJoin = kCALineJoinRound;
private func mask() {
let maskLayer = CAShapeLayer()
maskLayer.bounds = self.bounds
let ovalRect = self.hollowRect
let path = UIBezierPath(ovalInRect: ovalRect)
path.appendPath(UIBezierPath(rect: maskLayer.bounds))
maskLayer.path = path.CGPath
maskLayer.lineShape.lineCap = kCALineCapRound;
maskLayer.lineShape.lineJoin = kCALineJoinRound;
maskLayer.position = self.currentCenter
maskLayer.fillRule = kCAFillRuleEvenOdd
self.mask = maskLayer
}
private func drawTrack(ctx: CGContext) {
let adjustDegree = Math.adjustDegree(self.setting.startAngle, degree: self.degree)
let centerX = self.currentCenter.x
let centerY = self.currentCenter.y
let radius = min(centerX, centerY)
CGContextSetFillColorWithColor(ctx, self.setting.trackingColor.CGColor)
CGContextSetLineCap(ctx, CGLineCap.Round) …Run Code Online (Sandbox Code Playgroud) 问题
我正在创造爆炸环效果.我正在使用多个CAShapeLayer并UIBezierPath为每个图层创建一个.初始化视图时,所有图层都有一个宽度为的路径0.触发动作时,环会为更大的路径设置动画.
如下面的演示所示,每个图层的右手边缘比每个圆形图层的其余部分的动画效果要慢.
演示

码
绘制图层:
func draw(inView view: UIView) -> CAShapeLayer {
let shapeLayer = CAShapeLayer()
// size.width defaults to 0
let circlePath = UIBezierPath(arcCenter: view.center, radius: size.width / 2, startAngle: 0, endAngle: CGFloat(360.0).toRadians(), clockwise: true)
shapeLayer.path = circlePath.CGPath
shapeLayer.frame = view.frame
return shapeLayer
}
Run Code Online (Sandbox Code Playgroud)
更新图层
func updateAnimated(updatedOpacity: CGFloat, updatedSize: CGSize, duration: CGFloat) {
let updatePath = UIBezierPath(arcCenter: view.center, radius: updatedSize.width / 2,
startAngle: 0, endAngle: CGFloat(360).toRadians(), clockwise: true)
let pathAnimation = CABasicAnimation(keyPath: …Run Code Online (Sandbox Code Playgroud) 我试图找出一种方法来计算2轴坐标系中数据点的样条,以用作bezierPath(Swift).BezierParth需要具有正确的形状和坐标.
我的数据看起来像这样,我走的是红线之类的路径......
这甚至可能吗?
先感谢您
uibezierpath ×10
ios ×7
swift ×5
cashapelayer ×4
objective-c ×4
algorithm ×1
animation ×1
cornerradius ×1
drawing ×1
ellipse ×1
intersect ×1
shape ×1
uikit ×1
uiview ×1
xcode ×1