标签: cashapelayer

containsPoint不能与CAShapeLayer一起使用?

我有两个CAShapeLayers进入UIView的主要层.CAShapeLayers具有复杂的形状,我需要知道在形状边界内是否触摸了一个点.另外,我需要知道哪个形状被触及了.

我正在尝试containsPoint,但没有任何作用.

cocoa-touch core-graphics quartz-graphics uikit cashapelayer

4
推荐指数
1
解决办法
1061
查看次数

更改路径时CAShapeLayer不会更新

我正在使用CAShapeLayer.我试图使它的路径在鼠标事件发生时改变.例如,当发生鼠标按下事件时,CGMutableRefPath会将路径附加到a ,然后将形状图层的路径设置为它.

问题:当我CAShapeLayer使用新路径设置路径时,除非我这样做,否则不会使用新路径更新显示.如何告诉系统形状图层的路径已更改并重绘自身?

注意:当我创建可变路径的副本并将其传递时,它可以正常工作,但每次执行复制都不会有效并导致计算机在有很多路径时变慢.

CGMutablePathRef paths = CGPathCreateMutable();
CAShapeLayer *shapeLayer = [CAShapeLayer layer];

- (void)mouseDown:(NSEvent *)event {
    CGPathAddEllipseInRect(paths, nil, rect);
    self.shapeLayer.path = paths; // Works once, but subsequent calls do nothing
    self.shapeLayer.path = CGPathCreateCopy(paths); // Works, but super slow
}
Run Code Online (Sandbox Code Playgroud)

cocoa calayer cashapelayer

4
推荐指数
1
解决办法
4331
查看次数

如何在两个图像之间进行锯齿形层分离

我想合并两个图像,在它们之间添加Zigzag边界层.

这是一个图像的例子,我想在我的应用程序中集成.在此输入图像描述

我怎样才能在两幅图像之间实现这种幻觉?我也尝试过遮蔽图像,但它并没有给我正确想要的输出.

请帮我解决这个问题.任何建议将不胜感激.谢谢

core-graphics calayer uiimage cashapelayer ios

4
推荐指数
1
解决办法
1122
查看次数

需要提示UIBezierPath.像Instagram注册视图的三角形状

我试图创建一个像下面图片中的instagram三角形的bezier路径,但是我一定是做错了.Bezier路径没有显示!

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.

}

-(void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];

[self drawTriangle];

}

- (IBAction)closeButton:(UIButton *)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}

- (void)drawTriangle{

UIBezierPath* trianglePath = [UIBezierPath bezierPath];
[trianglePath moveToPoint:CGPointMake(self.signUpButton.center.x, self.signUpButton.frame.origin.y + 30)];
[trianglePath addLineToPoint:CGPointMake(self.signUpButton.center.x - 10, self.imageView.frame.size.height)];
[trianglePath addLineToPoint:CGPointMake(self.signUpButton.center.x + 10, self.imageView.frame.size.height)];

UIColor *fillColor = [UIColor whiteColor];
[fillColor setFill];
UIColor *strokeColor = [UIColor whiteColor];
[strokeColor setStroke];

 [trianglePath fill];
[trianglePath stroke];

[trianglePath closePath];
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

objective-c cashapelayer ios uibezierpath

4
推荐指数
1
解决办法
4331
查看次数

如何在IOS中"动画"改变视图的形状?(即改变它从一个到另一个的路径)

如何根据形状从一种形状到另一种形状"动画"改变自定义UIView?

比如说一个是创建一个看起来像一个形状的UIView,使用UIBezierPath创建.但是,您希望此视图对象以"动画"样式从自定义形状1更改为自定义形状2吗?所以我可以使用UIBezierPath创建两个独立的路径来表示两个形状,但我不清楚如何"动画"从一个到另一个移动?

还不确定'animate'是否是正确的术语.例如,如果这本质上是不可动画的,那么也许我的意思是"在视觉上变形"对象的视图从一个到另一个.

我正在阅读这些但仍然没有看到如何:UIBezierPath,CAShapeLayer,CADisplayLink,

core-animation uiview cashapelayer cadisplaylink uibezierpath

4
推荐指数
1
解决办法
1725
查看次数

使用UIBezierPath点绘制矩形时如何对角进行舍入

我使用UIBezierPath逐点添加一个矩形,现在我想要舍入这个矩形的角落,但似乎没有办法做到这一点.谁能帮我 ?

class RectangleLayer: CAShapeLayer {

    let animationDuration: CFTimeInterval = 0.5

    override init() {
        super.init()
        fillColor = Colors.clear.CGColor
        lineWidth = 5.0
        path = rectanglePathStart.CGPath
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
var rectanglePathStart: UIBezierPath {
        let rectanglePath = UIBezierPath()
        rectanglePath.moveToPoint(CGPoint(x: 0.0, y: 100.0))
        rectanglePath.addLineToPoint(CGPoint(x: 0.0, y: -lineWidth))
        rectanglePath.addLineToPoint(CGPoint(x: 100.0, y: -lineWidth))
        rectanglePath.addLineToPoint(CGPoint(x: 100.0, y: 100.0))
        rectanglePath.addLineToPoint(CGPoint(x: -lineWidth / 2, y: 100.0))

        rectanglePath.closePath()

//        fillColor = Colors.red.CGColor
        return rectanglePath
    }
}
Run Code Online (Sandbox Code Playgroud)

rounded-corners calayer cashapelayer uibezierpath swift

4
推荐指数
1
解决办法
1910
查看次数

CAShapeLayer 线的圆角

我想绘制带有圆角的对角线。我的代码:

class DiagonalView: UIView {

// MARK: - Public Properties

@IBInspectable var fillColor: UIColor = UIColor.white {
    didSet {
        self.diagonalLayer.strokeColor = fillColor.cgColor
        self.redraw()
    }
}

@IBInspectable var lineWidth: CGFloat = 1 {
    didSet {
        self.diagonalLayer.lineWidth = lineWidth
        self.redraw()
    }
}

// MARK: - Private Properties

private var diagonalLayer: CAShapeLayer = {
    let layer = CAShapeLayer()
    layer.fillColor = UIColor.clear.cgColor
    layer.strokeColor = UIColor.white.cgColor
    layer.lineCap = kCALineCapRound
    layer.lineWidth = 1
    return layer
}()

// MARK: - Constructors

override func awakeFromNib() {
    super.awakeFromNib()
    self.layer.addSublayer(self.diagonalLayer) …
Run Code Online (Sandbox Code Playgroud)

cashapelayer ios swift3

4
推荐指数
1
解决办法
1429
查看次数

CAShapeLayer左上角缺少像素

我使用的是CAShapeLayer同一个UIBezierPath画在视图中边界框.

这工作正常,但没有绘制第一个像素(顶部,左侧).

这是我的代码:

let focusSize = CGRect(x: focusX, y: focusY, width: focusWidth, height: focusHeight)
let focusPath = UIBezierPath(roundedRect: focusSize, cornerRadius: 0)

let borderLayer = CAShapeLayer()
borderLayer.path = focusPath.cgPath
borderLayer.fillColor = UIColor.clear.cgColor
borderLayer.strokeColor = UIColor.white.cgColor
borderLayer.lineWidth = 2
borderLayer.frame = self.someView.bounds
self.someView.layer.addSublayer(borderLayer)
Run Code Online (Sandbox Code Playgroud)

结果(注意顶部左上角的像素):

奇怪的像素

我认为这可能与抗锯齿相关,但是使用x,y和borderWidth似乎无法解决问题.有谁知道是什么原因造成的?

cashapelayer ios uibezierpath swift swift3.0.2

4
推荐指数
1
解决办法
224
查看次数

使用圆UIBezierPath和CABasicAnimation为CAShapeLayer设置动画

我想在15秒内将角度从0度设置为360度.

动画很怪异.我知道这可能是一个开始/结束角度问题,我已经遇到了圆形动画的那种问题,但我不知道如何解决这个问题.

var circle_layer=CAShapeLayer()
var circle_anim=CABasicAnimation(keyPath: "path")

func init_circle_layer(){
    let w=circle_view.bounds.width
    let center=CGPoint(x: w/2, y: w/2)

    //initial path
    let start_angle:CGFloat = -0.25*360*CGFloat.pi/180
    let initial_path=UIBezierPath(arcCenter: center, radius: w/2, startAngle: start_angle, endAngle: start_angle, clockwise: true)
    initial_path.addLine(to: center)

    //final path
    let end_angle:CGFloat=start_angle+360*CGFloat(CGFloat.pi/180)
    let final_path=UIBezierPath(arcCenter: center, radius: w/2, startAngle: start_angle, endAngle: end_angle, clockwise: true)
    final_path.addLine(to: center)

    //init layer
    circle_layer.path=initial_path.cgPath
    circle_layer.fillColor=UIColor(hex_code: "EA535D").cgColor
    circle_view.layer.addSublayer(circle_layer)

    //init anim
    circle_anim.duration=15
    circle_anim.fromValue=initial_path.cgPath
    circle_anim.toValue=final_path.cgPath
    circle_anim.isRemovedOnCompletion=false
    circle_anim.fillMode=kCAFillModeForwards
    circle_anim.delegate=self
}

func start_circle_animation(){
    circle_layer.add(circle_anim, forKey: "circle_anim")
}
Run Code Online (Sandbox Code Playgroud)

我希望从0度开始顶部并在完整巡回赛后完成顶部: 在此输入图像描述

在此输入图像描述

cabasicanimation cashapelayer ios uibezierpath swift

4
推荐指数
1
解决办法
3522
查看次数

如何从UIView中删除CAShapeLayer和CABasicAnimation?

这是我的代码:

@objc func drawForm() {
    i = Int(arc4random_uniform(UInt32(formNames.count)))
    var drawPath = actualFormNamesFromFormClass[i]
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.strokeColor = UIColor.black.cgColor
    shapeLayer.lineWidth = 6
    shapeLayer.frame = CGRect(x: -115, y: 280, width: 350, height: 350)

    var paths: [UIBezierPath] = drawPath()
    let shapeBounds = shapeLayer.bounds
    let mirror = CGAffineTransform(scaleX: 1,
                                   y: -1)
    let translate = CGAffineTransform(translationX: 0,
                                      y: shapeBounds.size.height)
    let concatenated = mirror.concatenating(translate)

    for path in paths {
        path.apply(concatenated)
    }

    guard let path = paths.first else {
        return
    }

    paths.dropFirst()
        .forEach {
            path.append($0)
    }

    shapeLayer.transform …
Run Code Online (Sandbox Code Playgroud)

cabasicanimation cashapelayer cgpath swift swift-playground

4
推荐指数
1
解决办法
1650
查看次数