我在使用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
但是,我希望将界限设为绿色,并按中风进行修剪
我正在使用此代码将图层应用于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) 我试图CAShapeLayer
用破折号模式来描述这些路径.我使用lineDashPattern
属性创建了许多破折号模式.但是这个属性并没有为strokes类型提供任何选项.我想成为我的破折号是圆点,如下图所示:
我知道它可以实现,因为我在许多应用程序中看到过这一点.但我无法找到任何方法在CAShapeLayer
库中实现它.所以我想知道如何获得这些圆点破折号模式?
在纵向模式下(第一次绘图)
旋转到横向后,为什么旧的形状:
我正在使用UIBezierPath
&CAShapeLayer
在自定义UIView
图层中绘制圆和线.问题是在设备旋转后能够成功绘制新的圆和线,我无法删除旧的绘制形状.在设备旋转后绘制的新形状是完美的,我只需要从屏幕上移除那些粘在屏幕上的旧形状.附图像.
我对iOS开发很新(所以请原谅我的无能 - 我到处寻找!),并且正在寻找一种方法来检测点击CAShapeLayer
.到目前为止,我遇到过hitTest
.是hitTest
最好的方法,如果是这样的话,如何在Swift中使用它,尤其是CAShapeLayer
s?另外,如果我有很多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
在其中实现此动画.
初始代码
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) 我有一个关于如何将多个蒙版应用到已经有蒙版的 UIView 的问题。
情况:
我有一个带有活动蒙版的视图,它在其左上角创建了一个洞,这是一个模板 UIView,在项目中的任何地方都可以重用。在项目后期,我希望能够创建第二个孔,但这次是在右下角,无需创建全新的 UIView。
问题:
当我应用底面罩时,它当然会替换第一个面罩,从而去除顶孔......有没有办法将它们结合起来?就此而言,将任何现有面具与新面具结合起来?
先感谢您!
cashapelayer ×10
ios ×10
uibezierpath ×6
swift ×5
objective-c ×3
uiview ×3
animation ×1
cocoa-touch ×1
cornerradius ×1
drawing ×1
iphone ×1
mask ×1