gpt4 book ai didi

ios - 类型 'CAShapeLayer' 的值没有成员 'leadingAnchor'

转载 作者:行者123 更新时间:2023-11-28 10:37:13 25 4
gpt4 key购买 nike

我有一个圆形,我使用 CAShapeLayer 绘制。现在我想将我的按钮约束到层的前导 anchor ,但随后我收到此错误“'CAShapeLayer' 类型的值没有成员'leadingAnchor'”。我怎样才能解决这个问题。代码:

btnSMSIcon.leadingAnchor.constraint(equalTo: shapeLayer.leadingAnchor, constant: 60).isActive = true

最佳答案

AutoLayout 处理 View ,而不是图层。如果你想在你的 AutoLayout 中包含一个层,将层附加到一个 View 。

(您可以创建一个自定义 UIView,其内容层是一个形状层,然后将您的自定义 UIView 放在 Storyboard中。当您调整 View 大小时,支持层也会调整大小。)

示例代码:

class ShapeView: UIView {

override class var layerClass: AnyClass {
return CAShapeLayer.self
}

}

编辑:

请注意,如果您使用 UIView 的自定义子类,其中 View 的 layerClassCAShapeLayer,则形状层将在 View 调整大小时调整大小,但路径不会'不会再生。如果边界大小发生变化,您需要告诉 View 重新生成它的路径。一种方法是在 View Controller 中实现 viewDidLayoutSubviews() 并让 viewDidLayoutSubviews() 告诉自定义 View 重建它的路径。

另一种处理它的方法是将 didSet 添加到 View 的 bounds 属性并在那里重建形状。

编辑#2

作为实验,我实现了一个如上所述的 ShapeView。我决定给它一个闭包,称为 createPathClosure,它创建它在形状层中安装的路径,并使其响应 View 边界的变化。当边界发生变化时,它会调用闭包来重建路径。

View 在初始化期间安装了一个默认闭包,但如果您想要绘制不同的路径,则可以在设置 View Controller 时替换闭包:

class ShapeView: UIView {

//This closure will be called when the view needs to rebuild the path for it's shape layer.
public var createPathClosure: ((ShapeView) -> Void)?

public var lineWidth: CGFloat = 5 {
didSet {
createPathClosure?(self)
}
}

override var bounds: CGRect {
didSet {
createPathClosure?(self)
}
}

//This class variable tells the system what kind of CALayer to create for this view.
//This view's backing layer is a CAShapeLayer.
override class var layerClass: AnyClass {
return CAShapeLayer.self
}

var shape: UIBezierPath? {
didSet {
guard let layer = layer as? CAShapeLayer,
let shape = shape else { return }
layer.path = shape.cgPath
}
}

override init(frame: CGRect) {
super.init(frame: frame)
setupShapeLayer()
createPathClosure?(self)
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupShapeLayer()
createPathClosure?(self)
}

func setupShapeLayer() {

//Set the stroke color, stroke width, and fill color for the shape layer.
guard let layer = layer as? CAShapeLayer else { return }
layer.strokeColor = UIColor.blue.cgColor
layer.lineWidth = lineWidth
layer.fillColor = UIColor.yellow.cgColor

//Define a placeholder createPathClosure (can be replaced)
createPathClosure = { shapeView in
let center = shapeView.superview?.convert(shapeView.center, to: shapeView) ?? CGPoint.zero
let radius = min(shapeView.bounds.size.width, shapeView.bounds.size.height)/2.0 - shapeView.lineWidth / 2.0
shapeView.shape = UIBezierPath(arcCenter: center,
radius: radius,
startAngle: 0,
endAngle: 2 * CGFloat.pi,
clockwise: true)
}
}
}

关于ios - 类型 'CAShapeLayer' 的值没有成员 'leadingAnchor',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52802176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com