iOS中类似于Android的水平线性进度条

14
如何在iOS中实现像Android一样的水平进度条?

Progressbar in iOS like Android

我已经尝试了以下方法,并发现了类似于确定的解决方案。
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)

}

但是我该如何实现其他功能,或者有没有好的资源可以帮助我实现?


https://www.cocoacontrols.com/controls/linearprogressbar - Jigar Tarsariya
3
请访问以下链接:https://github.com/lfarah/LinearProgressBar,并查看其中的Swift代码。 - Sharda Prasad
查看 https://github.com/Marxon13/M13ProgressSuite 和 https://github.com/mrackwitz/MRProgress。 - Rohan Sharma
2个回答

4

我曾为iOS开发了这个不确定进展的扩展程序。也许这可以帮助您。

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
    }
}

你怎样改变动画时间?我试过将持续时间从1改成10,把1.2改成10.2,但这只是让我在动画之间等待了10.2秒。 - Mayur Tolani
你想改变进度条从开始到结束所需的时间吗?只需将withDuration:1更改为withDuration:10即可。第二个是.now() + 1.2,这是线程在调用动画进度之前等待的时间。您可以更改此值以增加动画之间的时间。 - Kamran Bashir

0
这现在是 Material 组件的一部分,适用于 iOS。 https://material.io/develop/ios/components/progress-indicators/progress-views pod 'MaterialComponents/ProgressView'
import MaterialComponents.MaterialProgressView
代码示例:
    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)
    }

MDCProgressView似乎没有自己的模式属性。 :( - Faizyy
1
我不会再使用这个pod了:“2021年7月15日起,Material的iOS库将进入维护模式。” 如链接所述。 - Bruno Bieri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接