我有两个CAShapeLayers进入UIView的主要层.CAShapeLayers具有复杂的形状,我需要知道在形状边界内是否触摸了一个点.另外,我需要知道哪个形状被触及了.
我正在尝试containsPoint,但没有任何作用.
cocoa-touch core-graphics quartz-graphics uikit 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) 我想合并两个图像,在它们之间添加Zigzag边界层.
这是一个图像的例子,我想在我的应用程序中集成.
我怎样才能在两幅图像之间实现这种幻觉?我也尝试过遮蔽图像,但它并没有给我正确想要的输出.
请帮我解决这个问题.任何建议将不胜感激.谢谢
我试图创建一个像下面图片中的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)
如何根据形状从一种形状到另一种形状"动画"改变自定义UIView?
比如说一个是创建一个看起来像一个形状的UIView,使用UIBezierPath创建.但是,您希望此视图对象以"动画"样式从自定义形状1更改为自定义形状2吗?所以我可以使用UIBezierPath创建两个独立的路径来表示两个形状,但我不清楚如何"动画"从一个到另一个移动?
还不确定'animate'是否是正确的术语.例如,如果这本质上是不可动画的,那么也许我的意思是"在视觉上变形"对象的视图从一个到另一个.
我正在阅读这些但仍然没有看到如何:UIBezierPath,CAShapeLayer,CADisplayLink,
core-animation uiview cashapelayer cadisplaylink 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) 我想绘制带有圆角的对角线。我的代码:
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
同一个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似乎无法解决问题.有谁知道是什么原因造成的?
我想在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)
这是我的代码:
@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) cashapelayer ×10
ios ×5
uibezierpath ×5
swift ×4
calayer ×3
cgpath ×1
cocoa ×1
cocoa-touch ×1
objective-c ×1
swift3 ×1
swift3.0.2 ×1
uiimage ×1
uikit ×1
uiview ×1