Перемещение UIImageView по отношению к движению UIScrollView

#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