Swift – UIProgressView не является гладким с NSTimer

Поэтому я использую NSTimer, чтобы пользователь знал, что приложение работает. Индикатор выполнения настраивается на 3 секунды, но при запуске он отображается в режиме «тикания», и это не так гладко, как должно быть. В любом случае, я могу сделать его более гладким – я уверен, что только ошибка расчета с моей стороны ….

Если бы кто-нибудь мог взглянуть, это было бы здорово. Вот код:

import UIKit class LoadingScreen: UIViewController { var time : Float = 0.0 var timer: NSTimer? @IBOutlet weak var progressView: UIProgressView! override func viewDidLoad() { super.viewDidLoad() // Do stuff timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector:Selector("setProgress"), userInfo: nil, repeats: true) }//close viewDidLoad func setProgress() { time += 0.1 progressView.progress = time / 3 if time >= 3 { timer!.invalidate() } } } 

3 Solutions collect form web for “Swift – UIProgressView не является гладким с NSTimer”

Изменить: простая 3-секундная анимация UIView (рекомендуется)

Если ваш UIActivityIndicatorView плавно перемещается для указания активности, возможно, подумайте об использовании UIActivityIndicatorView или пользовательской анимации UIView:

 override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) UIView.animateWithDuration(3, animations: { () -> Void in self.progressView.setProgress(1.0, animated: true) }) } 

Убедитесь, что прогресс progressView установлен на ноль для начала. Это приведет к плавной 3-секундной анимации прогресса.

Простой анимированный прогресс (работает, но все же немного перескакивает)

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIProgressView_Class/#//apple_ref/occ/instm/UIProgressView/setProgress:animated :

 func setProgress() { time += 0.1 progressView.setProgress(time / 3, animated: true) if time >= 3 { timer!.invalidate() } } 

Опция с меньшими интервалами. (Не рекомендуется)

Установите таймер на меньший интервал:

 timer = NSTimer.scheduledTimerWithTimeInterval(0.001, target: self, selector:Selector("setProgress"), userInfo: nil, repeats: true) 

Затем обновите свою функцию

 func setProgress() { time += 0.001 progressView.setProgress(time / 3, animated: true) if time >= 3 { timer!.invalidate() } } 

Как насчет правильного способа анимации изменений: animateWithDuration: анимация: или CABasicAnimation . Вы можете использовать это для создания плавных анимаций

Трудно сказать, в чем проблема. Я хотел бы видеть вывод, если вы поместили строку печати в setProgress для печати метки времени. Действительно ли он стреляет каждую десятую секунды? Я предполагаю, что это не так.

Почему нет? Ну, таймер планирует выполнение цикла цикла в основном потоке для выполнения кода в setProgress. Эта задача не может выполняться до тех пор, пока не будут выполняться задачи перед ней в очереди. Поэтому, если в вашем основном потоке выполняются длительные задачи, ваш таймер будет срабатывать очень неточно. Мое первое предложение – это, возможно, то, что происходит.

Вот пример:

  1. Вы запускаете таймер, чтобы делать что-то каждую секунду.
  2. Сразу же после этого вы начинаете долгое задание основного потока (например, вы пытаетесь записать тонну данных в файл). Для выполнения этой задачи потребуется пять секунд.
  3. Ваш таймер хочет запускать через одну секунду, но ваша запись в файл забивает основной поток в течение следующих четырех секунд, поэтому таймер не может срабатывать еще на четыре секунды.

Если это так, то для решения проблемы вам нужно будет либо переместить этот основной поток в фоновый поток, либо выяснить способ его выполнения, периодически возвращаясь к циклу запуска. Например, во время длительной операции основного потока вы можете периодически вызывать runUntilDate в цикле выполнения, чтобы выполнять другие задачи цикла выполнения.

Обратите внимание, что вы не могли просто увеличивать количество полос индикатора выполнения в течение долгого выполнения задачи основного потока, потому что индикатор выполнения фактически не активирует его заполнение до тех пор, пока вы не вернетесь в цикл выполнения.

  • Как создать не округленный угол UIProgressView в ios с помощью Swift
  • UILabel над UIProgressView с несколькими цветами
  • animateWithDuration: развращает плавное увеличение шага прогресса
  • Обновление UIProgressView в UICollectionViewCell для загрузки файла
  • Узнайте о ходе загрузки для обновления UIprogressView
  • как немедленно изменить UIProgressView на UITableViewCell?
  • UIProgressView отображает проблемы в iOS 7
  • Как установить изображение прогресса в UIProgressView
  • iOS - UIProgressView обновляется только один раз
  • Высота представления прогресса в iOS 7
  • Как связать загрузку файла с представлением прогресса
  • Interesting Posts
    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.