【问题标题】:Custom circular progress view in awakeFromNibawakeFromNib 中的自定义循环进度视图
【发布时间】:2018-05-16 07:44:30
【问题描述】:

我使用 UIBezierPath 和 CAShapeLayer 以及以下代码创建了圆形进度视图。

let center = self.center

let trackLayer = CAShapeLayer()

let circularPath = UIBezierPath(arcCenter: center, radius: 100, startAngle: -CGFloat.pi / 2, endAngle: 2 * CGFloat.pi, clockwise: true)

trackLayer.path = circularPath.cgPath

trackLayer.strokeColor = UIColor.lightGray.cgColor
trackLayer.lineWidth = 10
trackLayer.fillColor = UIColor.clear.cgColor
trackLayer.lineCap = kCALineCapRound
self.layer.addSublayer(trackLayer)
shapeLayer.path = circularPath.cgPath
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.lineWidth = 10
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.lineCap = kCALineCapRound
shapeLayer.strokeEnd = 0
self.layer.addSublayer(shapeLayer)
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))

如果我将该代码放在我的 viewDidLoad 中,它可以正常工作。但是,当我从情节提要添加 UIView 并将其类设置为自定义类然后将所有代码复制到该自定义 UIView 类并在 awakeFromNib 函数中调用它时,它不起作用可能是什么原因?以及如何将上述代码与自定义 UIView 类一起使用?

橙色视图应该是我的自定义视图,我添加了前导、尾随、底部和固定高度约束,但它看起来像上面。圆形视图不需要放置橙色视图的中心吗?

【问题讨论】:

    标签: ios swift uiview uibezierpath cashapelayer


    【解决方案1】:

    实际上它可以工作,但它的位置错误。在这种情况下,该位置不在您的视野范围内,因此您看不到它。它让你认为你的代码不起作用。

    如果你想在你的视图中心有一个圆圈。将代码放在awakeFromNib 中并计算居中,不要使用self.center

    override func awakeFromNib() {
      let center = CGPoint.init(x: frame.width / 2, y: frame.height / 2)
    
      let trackLayer = CAShapeLayer()
      let shapeLayer = CAShapeLayer()
    
      let circularPath = UIBezierPath(arcCenter: center, radius: 100, startAngle: -CGFloat.pi / 2, endAngle: 2 * CGFloat.pi, clockwise: true)
    
      trackLayer.path = circularPath.cgPath
    
      trackLayer.strokeColor = UIColor.lightGray.cgColor
      trackLayer.lineWidth = 10
      trackLayer.fillColor = UIColor.clear.cgColor
      trackLayer.lineCap = kCALineCapRound
      self.layer.addSublayer(trackLayer)
      shapeLayer.path = circularPath.cgPath
      shapeLayer.strokeColor = UIColor.red.cgColor
      shapeLayer.lineWidth = 10
      shapeLayer.fillColor = UIColor.clear.cgColor
      shapeLayer.lineCap = kCALineCapRound
      shapeLayer.strokeEnd = 0
      self.layer.addSublayer(shapeLayer)
    }
    

    结果

    【讨论】:

    • 框架没有成员宽度
    • 谢谢哥们,它现在就像一个魅力,我需要在代码顶部还是底部调用 super.awakeFromNib,我还需要确保它调用一次吗?
    • @Sh_Khan 在 Objective-C 中,它没有,但在 Swift 中,它有。 stackoverflow.com/questions/27243451/…
    • @AtalayAsa 你应该在方法的顶部调用super.awakeFromNib(),并且不需要确定它被调用一次,因为awakeFromNib只被调用一次。
    • @Sh_Khan 请随意对我的回答投反对票。但我有一个建议给你。仅在您知道正确且公平!!!的情况下才给出答案
    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多