Friday, May 17, 2024
HomeiOS Developmentios - Configure Label and Round Progress Bar in Init vs layoutSubviews

ios – Configure Label and Round Progress Bar in Init vs layoutSubviews


I am engaged on a pace take a look at app which has a customized CircularProgressView that features a speedLabel and the speedLabel is centered within the progress view.

I’ve a createCircularPath technique to create the progress view’s path and I name it within layoutSubviews.

Once I configure the speedLabel within the customized view’s init and run the pace take a look at then the speedLabel textual content and the progressTrack is updating as anticipated because the take a look at is operating. But when I configure the speedLabel in layoutSubviews along with the round path than neither of them are being up to date.

I’ve tried taking part in with it by altering the z-scores. I’ve additionally tried embedding the round path, progressLayer and trackLayer inside one other view then including the view and label as subviews, however nonetheless the progress and pace are usually not being up to date throughout the pace take a look at when configured contained in the layoutSubviews.

On the lookout for a proof as to why that is.

Display screen captures of working progress (when speedLabel configured in init):
enter image description here
enter image description here

And when when speedLabel configured in layoutSubviews the label and progress simply keep static. Under is code when each configured in layoutSubviews

import UIKit

class CircularProgressView: UIView {
    
    var progressLayer = CAShapeLayer()
    var trackLayer = CAShapeLayer()
    var speedLabel = UILabel()
    
    override init(body: CGRect) {
        tremendous.init(body: body)
    }
    
    required init?(coder: NSCoder) {
        tremendous.init(coder: coder)
    }
    
    override func layoutSubviews() {
        tremendous.layoutSubviews()
        createCircularPath()
        configureSpeedLabel()
    }
    
    var progressColor = UIColor.white {
        didSet {
            progressLayer.strokeColor = progressColor.cgColor
        }
    }
    
    var trackColor = UIColor.white {
        didSet {
            trackLayer.strokeColor = trackColor.cgColor
        }
    }
    
    var pace = 0 {
        didSet {
            speedLabel.textual content = String(pace)
        }
    }
    
    fileprivate func configureSpeedLabel() {
        speedLabel.translatesAutoresizingMaskIntoConstraints = false
        speedLabel.textual content = String(pace)
        speedLabel.font = UIFont(identify: "TimesNewRomanPSMT", measurement: 24)
        speedLabel.textColor = UIColor.black
        speedLabel.isOpaque = true
        self.addSubview(speedLabel)
        NSLayoutConstraint.activate([
            speedLabel.centerXAnchor.constraint(equalTo: self.centerXAnchor),
            speedLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor)
        ])
    }
    fileprivate func createCircularPath() {
        self.backgroundColor = UIColor.clear
        self.layer.cornerRadius = self.body.width/2
        let path = UIBezierPath(arcCenter: CGPoint(x: body.width/2, y: body.peak/2), radius: (body.width - 1.5)/2, startAngle: CGFloat(-0.5 * .pi), endAngle: CGFloat(1.5 * .pi), clockwise: true)
        trackLayer.path = path.cgPath
        trackLayer.fillColor = UIColor.clear.cgColor
        trackLayer.strokeColor = trackColor.cgColor
        trackLayer.opacity = 0.3
        trackLayer.lineWidth = 10.0
        trackLayer.strokeEnd = 1.0
        self.layer.addSublayer(trackLayer)

        progressLayer.path = path.cgPath
        progressLayer.fillColor = UIColor.clear.cgColor
        progressLayer.strokeColor = progressColor.cgColor
        progressLayer.lineWidth = 10.0
        progressLayer.strokeEnd = 0.0
        self.layer.addSublayer(progressLayer)
    }

}



Supply hyperlink

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -
Google search engine

Most Popular

Recent Comments