标签: cashapelayer

使用CAShapeLayer和UIBezierPath剪辑屏蔽uiview

我在使用CAShapeLayer-UIBezierPath剪切视图时遇到问题,我想剪切内容但最终得到了一个带有UIBezierPath的笔画(帧),这是我的代码

UIBezierPath *path2Path = [UIBezierPath bezierPath];
[path2Path moveToPoint:CGPointMake(206.745, 0)];
[path2Path addLineToPoint:CGPointMake(206.745, 97.613)];
[path2Path addLineToPoint:CGPointMake(0, 97.613)];
[path2Path addLineToPoint:CGPointMake(0, 0)];
[path2Path addLineToPoint:CGPointMake(87.28, 0)];
[path2Path addCurveToPoint:CGPointMake(103.808, 12.118) controlPoint1:CGPointMake(87.28, 0) controlPoint2:CGPointMake(86.555, 12.118)];
[path2Path addCurveToPoint:CGPointMake(119.466, 0) controlPoint1:CGPointMake(121.061, 12.118) controlPoint2:CGPointMake(119.466, 0)];
[path2Path addLineToPoint:CGPointMake(206.745, 0)];
[path2Path closePath];

[path2Path addClip];

CAShapeLayer *pathLayer = [CAShapeLayer layer];
pathLayer.frame=MYVIEW.bounds;
pathLayer.path = path2Path.CGPath;

pathLayer.strokeColor = [[UIColor blackColor] CGColor];
pathLayer.fillColor = [[UIColor clearColor] CGColor];

pathLayer.fillRule=kCAFillRuleEvenOdd;
[MYVIEW.layer setMask:pathLayer];
[MYVIEW.layer setMasksToBounds:YES];

MYVIEW.backgroundColor=[UIColor greenColor];
Run Code Online (Sandbox Code Playgroud)

这段代码的结果只是一个绿色笔划线,边界是空的,就像这样 http://i.stack.imgur.com/aehdo.png

但是,我希望将界限设为绿色,并按中风进行修剪

objective-c uiview cashapelayer ios uibezierpath

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

将CAShapeLayer蒙版应用于UIView

我正在使用此代码将图层应用于UIview:

mask = [[CAShapeLayer alloc] init];
mask.frame = baseView.layer.bounds;
CGRect biggerRect = CGRectMake(mask.frame.origin.x, mask.frame.origin.y, mask.frame.size.width, mask.frame.size.height);
CGRect smallerRect = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);

UIBezierPath *maskPath = [UIBezierPath bezierPath];
[maskPath moveToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMaxY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMaxY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMinY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))];

[maskPath moveToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMaxY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMaxY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMinY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))];

mask.path = maskPath.CGPath;
[mask setFillRule:kCAFillRuleEvenOdd];
mask.fillColor = [[UIColor blackColor] CGColor];
baseView.layer.mask = mask;
Run Code Online (Sandbox Code Playgroud)

由于我要剪切的矩形发生了变化,我很想知道是否有一种快速方法可以更改蒙版的大小,而不是仅仅从UIview中删除它并使用不同的尺寸重新应用它:

例如

[mask removeFromSuperlayer];
Run Code Online (Sandbox Code Playgroud)

和...

mask = [[CAShapeLayer alloc] …
Run Code Online (Sandbox Code Playgroud)

iphone cocoa-touch uiview cashapelayer ios

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

如何为CAShapeLayer绘制圆点笔划图案?

我试图CAShapeLayer用破折号模式来描述这些路径.我使用lineDashPattern属性创建了许多破折号模式.但是这个属性并没有为strokes类型提供任何选项.我想成为我的破折号是圆点,如下图所示:

在此输入图像描述

我知道它可以实现,因为我在许多应用程序中看到过这一点.但我无法找到任何方法在CAShapeLayer库中实现它.所以我想知道如何获得这些圆点破折号模式?

core-graphics objective-c cashapelayer ios

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

完全删除UIBezierPath和CAShapeLayer绘制的项目

在纵向模式下(第一次绘图)

在此输入图像描述

旋转到横向后,为什么旧​​的形状:

在此输入图像描述

我正在使用UIBezierPath&CAShapeLayer在自定义UIView图层中绘制圆和线.问题是在设备旋转后能够成功绘制新的圆和线,我无法删除旧的绘制形状.在设备旋转后绘制的新形状是完美的,我只需要从屏幕上移除那些粘在屏幕上的旧形状.附图像.

drawing objective-c cashapelayer ios uibezierpath

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

在Swift中检测CAShapeLayer上的点击?

我对iOS开发很新(所以请原谅我的无能 - 我到处寻找!),并且正在寻找一种方法来检测点击CAShapeLayer.到目前为止,我遇到过hitTest.是hitTest最好的方法,如果是这样的话,如何在Swift中使用它,尤其是CAShapeLayers?另外,如果我有很多CAShapeLayers,我如何使用hitTest方法单独引用它们?

这就是我创建CAShapeLayer的方法:

    let newBounds = CGRect(x: 0, y: 0, width: 200, height: 200)
    let newShape = CAShapeLayer()
    newShape.bounds = newBounds
    newShape.position = view.center
    newShape.cornerRadius = newBounds.width / 2
    newShape.path = UIBezierPath(ovalInRect: newShape.bounds).CGPath

    newShape.lineWidth = 42
    newShape.strokeColor = UIColor(red: 222/255.0, green: 171/255.0, blue: 66/255.0, alpha: 1.0).CGColor
    newShape.fillColor = UIColor.clearColor().CGColor

    newShape.strokeStart = 0.2
    newShape.strokeEnd = 0.4

    view.layer.addSublayer(newShape)
Run Code Online (Sandbox Code Playgroud)

cashapelayer ios swift

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

使用波动画动画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
查看次数

如何将多个蒙版应用于 UIView

我有一个关于如何将多个蒙版应用到已经有蒙版的 UIView 的问题。

情况:
我有一个带有活动蒙版的视图,它在其左上角创建了一个洞,这是一个模板 UIView,在项目中的任何地方都可以重用。在项目后期,我希望能够创建第二个孔,但这次是在右下角,无需创建全新的 UIView。

问题:
当我应用底面罩时,它当然会替换第一个面罩,从而去除顶孔......有没有办法将它们结合起来?就此而言,将任何现有面具与新面具结合起来?

先感谢您!

mask uiview cashapelayer ios swift

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