Обращение к блоку DispatchQueue.main.asyncAfter(deadline: .now()+2.0)
не ждет, пока это не будет сделано ... следующая строка кода будет выполнена немедленно.
Итак, в вашем опубликованном коде вы эффективно говоря:
set the pin to Red
wait 2 seconds
set the pin to Medium Red
set the pin to Light Red
set the pin to White
Вы можете исправить это, используя:
.now()+0.25 // wait 1/4 second
.now()+0.50 // wait 1/2 second
.now()+0.75 // wait 3/4 second
, чтобы каждый блок выполнялся на 1/4 секунды после предыдущего.
Цвет оттенка не может быть анимирован, поэтому вы не можете использовать его в блоке UIView.animate()
.
Однако цвет оттенка штифта красный-белый-красный изменяется do выглядит немного «блеклым», поэтому вы можете быть доволен:
func animPinColor(_ v: MKPinAnnotationView) -> Void {
// set pin to white
v.pinTintColor = .white
// wait 0.25 seconds ... adjust as desired
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
// set pin back to red
v.pinTintColor = .red
}
}
Или, если вы хотите немного больше контроля:
func animPinColor(_ v: MKPinAnnotationView) -> Void {
// verbose, for clarity
let red = UIColor(red: 255/255, green: 0, blue: 0, alpha: 1)
let mediumRed = UIColor(red: 255/255, green: 110/255, blue: 110/255, alpha: 1)
let lightRed = UIColor(red: 255/255, green: 180/255, blue: 180/255, alpha: 1)
let white = UIColor(red: 255/255, green: 255/255, blue: 255/255, alpha: 1)
let colors: [UIColor] = [
mediumRed,
lightRed,
white,
lightRed,
mediumRed,
red,
]
// 1/2 second color animation ... adjust as desired
let totalDuration: Double = 0.5
// each step will take totalDuration divided by total steps
let relativeDuration = totalDuration / Double(colors.count)
for i in 0..<colors.count {
DispatchQueue.main.asyncAfter(deadline: .now() + Double(i) * relativeDuration) {
v.pinTintColor = colors[i]
}
}
}
Вы можете поиграть с продолжительностью / таймингом и даже можете добавить больше «оттенков красного» для получения еще более плавного перехода.
Изменить
Исходя из опубликованного вами кода, я предполагаю, что у вас есть ссылка на MKPinAnnotationView
?
Если да, то использование будет следующим:
if annotation.identifier == "redpin" {
//view.pinTintColor = .red
animPinColor(view)
}