Опрос уровня представления UISlider
Я настраиваю простой UISlider, чтобы оживить его прогресс:
[UIView animateWithDuration:songLength
delay:0.0
options:UIViewAnimationOptionRepeat|
UIViewAnimationOptionAllowUserInteraction|
UIViewAnimationOptionBeginFromCurrentState
animations:^{
[UIView setAnimationDuration:10.0];
[myUISlider setValue:10.0];
} completion:nil
];
[UIView commitAnimations];
когда пользователь нажимает кнопку, я хочу остановить анимацию на своем месте.
Я понимаю, что мне нужно запросить уровень представления, чтобы выяснить значение, однако уровень представления имеет тип CALayer, а не UISlider. следовательно, у него есть свойства слоя, такие как положение x/y на экране, но не значение самого слайдера.
имеет смысл, что по своему дизайну уровень представления может получить доступ ко всем текущим анимированным данным слоя, но я не уверен, как это сделать в коде.
есть идеи?
1 ответ
Я нашел один способ решения этого вопроса, если вы имеете дело с той же проблемой. По замыслу нет очевидного способа запросить анимированный большой палец UISlider. Запросы анимации хорошо работают для слоя, поэтому один из способов - создать собственный фон и анимировать слой, который является большим пальцем.
способ, которым я работал вокруг этого, является использованием класса NSTimer. Как только я хочу, чтобы индикатор выполнения начал анимацию, я устанавливаю NSTimer с интервалом 0,1 с и вызываю функцию для обновления местоположения большого пальца. анимация до / после большого пальца (по мере продвижения левая часть синего цвета, а то, что осталось, все еще белого цвета) автоматически обрабатывается для вас.
вот код:
updateTimer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(updateCurrentTime) userInfo:p repeats:YES];
таким образом, каждые 0,01 секунды этот метод вызывается, и он перерисовывает большой палец, создавая анимацию. нет необходимости в анимационном блоке.
это работает хорошо, и я доволен результатами. Я обеспокоен производительностью и буду измерять, насколько ресурсоемка эта реализация. может быть, это хорошая идея, чтобы пойти с первым вариантом, который я упомянул выше.