Повторить функцию по временному интервалу?

91
2

У меня есть функция, которая делает изображение на мой взгляд "дрожащим" назад и вперед. Я могу установить, как долго я хочу, чтобы он дрожал и скорость, но мне действительно нужно, чтобы он дрожал каждые 10 секунд.

Вот функция, с которой я работаю, она просто вызывается однажды в viewDidLoad, чтобы заставить ее работать один раз.

    func shakeView(){

let shake:CABasicAnimation = CABasicAnimation(keyPath: "position")
shake.duration = 0.4
shake.repeatCount = 5
shake.autoreverses = true
shake.speed = 9.0

let from_point:CGPoint = CGPointMake(homeLogo.center.x - 5, homeLogo.center.y)
let from_value:NSValue = NSValue(CGPoint: from_point)

let to_point:CGPoint = CGPointMake(homeLogo.center.x + 5, homeLogo.center.y)
let to_value:NSValue = NSValue(CGPoint: to_point)

shake.fromValue = from_value
shake.toValue = to_value
homeLogo.layer.addAnimation(shake, forKey: "position")
}

Мне не повезло узнать, как я могу это сделать. Любая помощь или указание в правильном направлении были бы весьма признательны.

спросил(а) 2016-03-28T10:52:00+03:00 4 года, 8 месяцев назад
1
Решение
59

Вы не добавили бы этого требования к анимации, вы создали NSTimer с требуемым периодом и использовали бы его для запуска каждой новой анимации.

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

ответил(а) 2016-03-28T10:59:00+03:00 4 года, 8 месяцев назад
71

Вам нужно использовать NSTimer. Используйте нижеприведенный код:

override func viewDidLoad() {
super.viewDidLoad()
var helloWorldTimer = NSTimer.scheduledTimerWithTimeInterval(10.0, target: self, selector: Selector("shakeView"), userInfo: nil, repeats: true)
}

ответил(а) 2016-03-28T11:00:00+03:00 4 года, 8 месяцев назад
58

Используйте таймер для этого.

[NSTimer scheduleTimerWithTimeInterval: 10 target: self selector: @selector (functionName) userInfo: nil repeatts: YES];

ответил(а) 2016-03-28T10:58:00+03:00 4 года, 8 месяцев назад
59

Смотрит на этот документ: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/

Существует функция с именем scheduledTimerWithTimeInterval которая может выполнять селектор каждый указанный вами интервал времени

В быстром: как я могу использовать NSTimer в Swift?

Образец:

override func viewDidLoad() {
super.viewDidLoad()
//Swift 2.2 selector syntax
var timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(MyClass.update), userInfo: nil, repeats: true)
//Swift <2.2 selector syntax
var timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true)
}

ответил(а) 2016-03-28T10:58:00+03:00 4 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема