Постепенно меняйте цвет на PIN (Отметить местоположение) на карте - PullRequest
0 голосов
/ 06 августа 2020

У меня есть экран моего приложения, использующего карту iOS UIMap. На карте есть PIN-коды (отметка местоположения человеческого интерфейса Apple), которые обозначают сейсмометры, и каждые 6 секунд карта обновляется, и некоторые из этих сейсмометров вибрируют и становятся красными. Я должен дать PIN-кодам на карте эффект затухания, переходя от ярко-красного к очень светло-красному.

if annotation.identifier == "redpin" {
   view.pinTintColor = .red
   DispatchQueue.main.asyncAfter(deadline: .now()+2.0 ) {
      view.pinTintColor = UIColor(red: 255/255, green: 110/255, blue: 110/255, alpha: 1)
   }
   DispatchQueue.main.asyncAfter(deadline: .now()+2.0 ) {
      view.pinTintColor = UIColor(red: 255/255, green: 180/255, blue: 180/255, alpha: 1)
   }
   DispatchQueue.main.asyncAfter(deadline: .now()+2.0 ) {
      view.pinTintColor = UIColor(red: 255/255, green: 255/255, blue: 255/255, alpha: 1)
   }
}

Я использовал этот метод, используя таймер, который меняет цвет PIN-кодов, которые вибрируют каждые 2 секунд, создавая эффект затухания вручную. Для первых, которые вибрируют при первом обновлении, это нормально, но затем те, которые идут после, сохраняют последний цвет (белый), а не красно-красный светло-белый. Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 08 августа 2020

Обращение к блоку 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...