【发布时间】:2017-12-19 03:51:05
【问题描述】:
我正在尝试使用 CAShapeLayer 绘制一个圆形按钮并为其设置动画,但只是绘图让我很头疼 - 我似乎无法弄清楚如何将数据传递给我的班级。
这是我的设置: - 将绘制 CAShapeLayer 的 UIView 类型的类 - 视图在我的视图控制器中呈现并使用自动布局约束构建
我曾尝试使用 layoutIfNeeded,但似乎传递数据太晚而无法绘制视图。我也尝试在 vieWillLayoutSubviews() 中重绘视图,但没有。下面的示例代码。我做错了什么?
我是否过早/过晚地传递数据? 我画 bezierPath 是不是太晚了?
非常感谢您的指点。
也许还有第二个后续问题:是否有更简单的方法来绘制绑定到其视图大小的圆形路径?
在我的视图控制器中:
import UIKit
class ViewController: UIViewController {
let buttonView: CircleButton = {
let view = CircleButton()
view.backgroundColor = .black
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
override func viewWillLayoutSubviews() {
}
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(buttonView)
buttonView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
buttonView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
buttonView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.75).isActive = true
buttonView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.25).isActive = true
buttonView.layoutIfNeeded()
buttonView.arcCenter = buttonView.center
buttonView.radius = buttonView.frame.width/2
}
override func viewDidAppear(_ animated: Bool) {
print(buttonView.arcCenter)
print(buttonView.radius)
}
}
还有 buttonView 的类:
class CircleButton: UIView {
//Casting outer circular layers
let trackLayer = CAShapeLayer()
var arcCenter = CGPoint()
var radius = CGFloat()
//UIView Init
override init(frame: CGRect) {
super.init(frame: frame)
}
//UIView post init
override func layoutSubviews() {
super.layoutSubviews()
print("StudyButtonView arcCenter \(arcCenter)")
print("StudyButtonView radius \(radius)")
layer.addSublayer(trackLayer)
let outerCircularPath = UIBezierPath(arcCenter: arcCenter, radius: radius, startAngle: 0, endAngle: 2*CGFloat.pi, clockwise: true)
trackLayer.path = outerCircularPath.cgPath
trackLayer.strokeColor = UIColor.lightGray.cgColor
trackLayer.lineWidth = 5
trackLayer.strokeStart = 0
trackLayer.strokeEnd = 1
trackLayer.fillColor = UIColor.clear.cgColor
trackLayer.transform = CATransform3DMakeRotation(-CGFloat.pi/2, 0, 0, 1)
}
//Required for subclass
required init?(coder aDecoder: NSCoder) {
fatalError("has not been implemented")
}
}
【问题讨论】:
标签: swift autolayout uibezierpath