#ios #cocoa-touch #uiscrollview #uiimageview
#iOS #cocoa-touch #uiscrollview #uiimageview
Вопрос:
В моем self.view у меня есть UIScrollView
self.ScrollView, а в self.ScrollView у меня есть два UIViews
, которые называются self.panedView и self.recordView. Мой self.panedView имеет высоту 568 и начало координат 0, а мой self.recordView имеет высоту 274 и начало координат 568. Мой self.ScrollView имеет высоту размера содержимого, равную высоте 842 (высота self.panedView высота self.recordView). Я хочу добавить UIImageView
вызываемый self.iconImageView поверх self.panedView, чтобы при прокрутке ImageView перемещался на определенную позицию в зависимости от того, сколько я прокручиваю. self.iconImageView имеет позицию Y, равную 184, и является всего лишь подклассом self.view . Я изначально перемещал свой self.iconImageView UIView animationWithDuration
всякий раз, когда обнаруживался свайп вверх, выполняя следующие действия:
- (void)viewDidLoad
{
[self.view insertSubview:self.iconImageView aboveSubview:self.panedView];
}
[UIView animateWithDuration:.25 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
self.iconImageView.frame = CGRectOffset(self.iconImageView.frame, 0, -85.5);
} completion:nil];
Как я могу воспроизвести это теперь, когда я переключился на a UIScrollView
? Я думаю, что что-то подобное может сработать:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if(self.iconImageView.center.y >= 184 amp;amp; self.iconImageView.center.y <=451)
{
CGPoint newCenter = CGPointMake(self.view.bounds.size.width/2, self.iconImageView.center.y (self.scrollView.contentOffset.y/self.scrollView.contentOffset.y));
self.iconImageView.center = newCenter;
}
}
Комментарии:
1. Почему бы вам просто не добавить свой UIImageView в качестве подвида вашего pannedView? Или просто добавьте его прямо поверх вашего pannedView, но как подвида UIScrollView.
2. Я думаю, что включение его в качестве подвида pannedView делает его более сложным. Если его нет в ScrollView, по крайней мере, я могу взять вертикальный contentOffset ScrollView и перевести начало координат Y моего ImageView для соответствующего перемещения, изменив центр изображения Y или выполнив CGRectOffset. Это работает не так, как я надеялся.
3. Итак, изначально я перемещал panedView и iconImageView туда, где я хотел, чтобы они использовались
UIView animationWithDuration
, иCGRectOffset
когда был обнаружен свайп. Однако теперь я использую ScrollView.contentOffset для перевода iconImageView для перемещения по отношению к перемещению представления содержимого. Проблема в том, что iconImageView достигает того места, где он должен остановиться, в то время как panedView еще предстоит пройти долгий путь, чтобы достичь точки остановки.
Ответ №1:
Реализовать UIScrollViewDelegate. Всякий раз, когда прокручивается вид прокрутки (даже программно), вы получаете событие.
Комментарии:
1. Буду ли я использовать
scrollViewDidScroll:
?2. Да, вы должны использовать scrollViewDidScroll. Получите contentOffset для просмотра прокрутки, и вы узнаете, сколько он прокрутил.
3. Я могу заставить ImageView перемещаться вместе с ScrollView, но перемещение ImageView не пропорционально перемещению смещения. Изображение перемещается слишком быстро по сравнению с движением ScrollView. Код включен выше.
4. Используйте
if(self.iconImageView.center.y >= 177.5) { [UIView animateWithDuration....] }
или удалитеif(self.iconImageView.center.y >= 177.5)
это, чтобы перемещать изображение при прокрутке. В настоящее время он ожидает, пока вы не достигнете порога, и внезапно перемещается после этого.5. Я отредактировал свои ограничения для моего iconImageView
scrollViewDidScroll
выше. Я заметил, что если я прокручиваю медленно, iconImageView соответствует установленным мной ограничениям. Однако, если я прокручиваю очень быстро, он не соответствует установленным мной ограничениямscrollViewDidScroll