Horizontal Linear Progress Bar like Android in iOS

Viewed 11354

How to do I implement a horizontal progress bar in iOS like as Android.

Progressbar in iOS like Android

I have tried the following, and found a solution like deteminate.

func startSendPickUpRequestShakeTimer () {

        if self.movingViewTimer == nil {
            self.movingViewTimer =  Timer.scheduledTimer(
                timeInterval: TimeInterval(movingViewSpeed),
                target      : self,
                selector    : #selector(self.startAnimating),
                userInfo    : nil,
                repeats     : true)
        }
}

func startAnimating() {

        let movingViewX = movingView.frame.minX >= view.frame.maxX ? 0-movingView.frame.width-forwardX:movingView.frame.minX + forwardX

        self.movingView.frame = CGRect(x: movingViewX, y: movingView.frame.minY, width: movingView.frame.width, height: moviewViewHeight)

}

But how can I implement the others, or is there any good resource to do that?

2 Answers

I had coded this extension for indetermined progress in ios. Maybe this can help

extension UIProgressView{
    private struct Holder {
        static var _progressFull:Bool = false
        static var _completeLoading:Bool = false;
    }

    var progressFull:Bool {
        get {
            return Holder._progressFull
        }
        set(newValue) {
            Holder._progressFull = newValue
        }
    }

    var completeLoading:Bool {
        get {
            return Holder._completeLoading
        }
        set(newValue) {
            Holder._completeLoading = newValue
        }
    }

    func animateProgress(){
        if(completeLoading){
            return
        }
        UIView.animate(withDuration: 1, animations: {
            self.setProgress(self.progressFull ? 1.0 : 0.0, animated: true)
        })

        progressFull = !progressFull;

        DispatchQueue.main.asyncAfter(deadline: .now() + 1.2) {
            self.animateProgress();
        }
    }

    func startIndefinateProgress(){
        isHidden = false
        completeLoading = false
        animateProgress()
    }

    func stopIndefinateProgress(){
        completeLoading = true
        isHidden = true
    }
}

This is now part of Material components for iOS. https://material.io/develop/ios/components/progress-indicators/progress-views

pod 'MaterialComponents/ProgressView'

import MaterialComponents.MaterialProgressView

Code sample:

    let progressView = MDCProgressView()
    progressView.mode = .indeterminate        
    progressView.progressTintColor = .white
    progressView.trackTintColor = UIColor.white.withAlphaComponent(0.2)
    progressView.startAnimating()
    
    view.addSubview(progressView)
    //Then set constraints for your view (I used SnapKit https://github.com/SnapKit/SnapKit)
    progressView.snp.makeConstraints { (make) in
        make.left.equalTo(header.snp.left)
        make.right.equalTo(header.snp.right)
        make.top.equalTo(header.snp.bottom).offset(20)
        make.height.equalTo(4)
    }
Related