标签: uibezierpath

在Core Graphics中斜切路径/形状

我正试图在核心图形中斜切路径.有没有人已经为任意形状做过这个,如果是这样,他们是否愿意共享代码?

我在下面列出了我的实现.我用三个变量来确定伞:CGFloat bevelSize,UIColor highlightColor,UIColor shadow.请注意,光源的角度始终为135度.我还没有完成这个,但这里基本上是我要做的,分成两部分.第一部分,产生焦点:

  1. 我找到了路径中每条相邻线之间角度的平分线.
  2. 对于弧,平分线是垂直于由弧的两个端点产生的线的线,源自中点.这应该照顾使用电弧的大多数情况.我不拿弧线和线的平分线.在这些情况下,弧平分线应该可以正常工作.
  3. 然后,我根据每个相邻平分线的交点计算焦点.
  4. 如果焦点位于其使用的形状内,否则将被丢弃.

产生焦点的目的是按比例"缩小"形状.

第二部分有点复杂.我必须创建斜面形状的每个边/部分.我这样做是通过bevelSize沿着从最近的焦点延伸到所讨论的点的线的半径来绘制(由)原始形状的每个点.当我有两个连续的'bevelPoints'时,我创建了一个UIBezierPath,它从bevelPoints延伸到原始点并返回到bevelPoints(注意,这包括弧).这会创建一个我可以用来填充的"边/段".在直边,我只是填充阴影或高光颜色,取决于侧面的角度.对于弧,我确定弧度'弧'.如果该弧包含一个过渡角(M_PI_4或M_PI + M_PI_4),我用渐变填充它(从阴影到高光或高亮到阴影,这是合适的).否则我用纯色填充它.

更新

我把我的答案(见下文)分成了一个单独的博文.我不再使用您在上面看到的实现细节,但我将其全部保留在那里以供参考.我希望这可以帮助其他人使用Core Graphics.

core-graphics objective-c shape uibezierpath

7
推荐指数
1
解决办法
1511
查看次数

在Objective-C中绘制具有起始和结束角度的椭圆

我正在编写一个iPad应用程序,我在其中渲染表示形状的XML对象到屏幕上的图形.我试图渲染的对象之一是弧.基本上这些弧为我提供了一个边界矩形以及一个开始和结束角度.

给定属性:

  • X
  • ÿ
  • 宽度
  • 高度
  • 由startAngle
  • endAngle

使用这些值,我需要绘制弧(基本上是椭圆的一部分).我不能使用以下内容:

    UIBezierPath *arc = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(x, y, width, height)];
    [UIColor blackColor] setStroke];
    [arc stroke];
Run Code Online (Sandbox Code Playgroud)

因为它绘制了一个完整的椭圆.基本上我需要上面但是它需要考虑开始和结束角度,因此只显示椭圆的一部分.我认为这将涉及绘制三次贝塞尔曲线或二次贝塞尔曲线.问题是我不知道如何用我给出的信息计算起点,终点或控制点.

objective-c ellipse ios uibezierpath geometric-arc

7
推荐指数
1
解决办法
1万
查看次数

UIBezierPath相交

我一直在寻找一个小时的答案,但很难找到关于这个主题的任何内容.

我有一个与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)

algorithm drawing objective-c intersect uibezierpath

7
推荐指数
1
解决办法
4316
查看次数

使用UIBezierPath获取"无效上下文"错误

我试图让这个绘制一条平移手势发生的线.问题是当我尝试使用此代码时

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)

uibezierpath swift

7
推荐指数
1
解决办法
2901
查看次数

在UIView中绘制UIBezierPaths而不进行子类化?

我是使用UIBezierPaths绘制形状的新手.到目前为止我发现的所有示例都涉及首先对视图进行子类化,然后重写drawRect:方法并在其中进行绘制,但是我无法找到任何绝对确定的说明这是否是绘制UIBezierPaths的唯一方法在UIView中,或者如果这只是最实用的方式.

有没有其他方法(除了调配)在UIView中绘制UIBezierPath而不进行子类化?

objective-c uikit uiview ios uibezierpath

7
推荐指数
2
解决办法
5632
查看次数

使用波动画动画CAShapeLayer

下面我有附加图像,我想实现下面的动画.我尝试过水波动画,但不知道如何像上面那样控制动画.

我必须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)

animation cashapelayer ios uibezierpath

7
推荐指数
1
解决办法
1699
查看次数

如何为UIBezierPath提供cornerRadius

我使用以下代码创建了一个矩形,现在我需要舍入这个矩形的角.但是我找不到一个名为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)

cornerradius cashapelayer ios uibezierpath swift

7
推荐指数
2
解决办法
6422
查看次数

Swift - 如何在 CAShapeLayer 或 UIBezierPath(ovalInRect:ovalRect) 上获得圆顶

我在我的类中有这两个函数,它们扩展了 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)

rounded-corners cashapelayer ios uibezierpath swift

7
推荐指数
2
解决办法
7565
查看次数

在两个圆形UIBezierPaths之间进行动画制作时的奇怪行为

问题
我正在创造爆炸环效果.我正在使用多个CAShapeLayerUIBezierPath为每个图层创建一个.初始化视图时,所有图层都有一个宽度为的路径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)

cashapelayer ios uibezierpath swift

7
推荐指数
1
解决办法
83
查看次数

2轴坐标系bezierpath中的数据点样条

我试图找出一种方法来计算2轴坐标系中数据点的样条,以用作bezierPath(Swift).BezierParth需要具有正确的形状和坐标.

我的数据看起来像这样,我走的是红线之类的路径......

这甚至可能吗?

先感谢您

我的数据看起来像这样

xcode ios uibezierpath swift

7
推荐指数
1
解决办法
112
查看次数