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 в цикле выполнения, чтобы выполнять другие задачи цикла выполнения.

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

  • как сделать представление прогресса, как в приложении KAYAK
  • Скрыть UIProgressView после того, как выборка для PHAsset завершена, и прогресс завершен
  • UIProgressView с прогрессом при низкой стоимости
  • Как заставить UIProgressView показывать ход загрузки NSArray из файла (iPhone)?
  • Узнайте о ходе загрузки для обновления UIprogressView
  • увеличьте высоту UIProgressView при ее использовании как titleView в панели навигации
  • Полоса хода, соединяющая музыкальную кнопку
  • Скачать прохождение в ячейке
  • Создание UIProgressView Округлые углы
  • установить представление прогресса в цикле или обновить представление прогресса
  • Как установить изображение прогресса в UIProgressView
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.