Плавающий Вид внутри позиций прокрутки
У меня есть требование, как показано ниже, чтобы показать "речевой пузырь" на масштабируемом + перетаскиваемом изображении ниже.
Речевой пузырь НЕ ДОЛЖЕН БЫТЬ изменяемым или перетаскиваемым и должен указывать на правильное место, когда изображение ниже изменяется или перетаскивается.
Сначала я могу разместить речевой пузырь в нужном месте. Но я не могу заставить его оставаться в нужном месте при перетаскивании или масштабировании.
Я пытался делать вычисления и помещать его в нужное место во время "scrollviewenddragging" и т. Д., Но ничего не работает идеально. Одна из основных проблем, которую я вижу, заключается в том, что плавающее место просмотра "сбрасывается" в раскадровку x,y во время второго прохода "scrollviewdidscroll".
Каков наилучший способ справиться с этим. Есть указатели?
2 ответа
Хорошо, есть несколько способов сделать это. (1) Вы можете добавить всплывающее представление к вашему просмотру прокрутки. Его положение останется привязанным, но при изменении масштаба его размер нужно будет изменить. Сделайте это в методе делегата scrollView - scrollViewDidZoom, когда происходит масштабирование. (2) Вы не можете добавить его в scrollView, но вместо этого добавить его, чтобы сказать представление вашего ViewController (после того, как scrollView был добавлен в представление VC). Тогда вам не нужно будет изменять размер пузырькового представления, но вам нужно будет переместить его в делегат scrollView - метод scrollViewDidScroll, когда происходит прокрутка.
В любом случае, свойство scrollView.zoomScale является ссылкой на новый размер или позицию вашего всплывающего окна.
Я опишу способ 2 выше. Сначала поместите пузырьковый вид в виде ВК. Выберите опорную точку для пузырькового представления, т.е. где вы хотите разместить его относительно scrollView. Я выберу точку (для центра пузырькового представления) из точки в scrollView, скажем (500, 200), и сопоставлю ее с точкой в виде моего VC.
Так что в методе viewWillAppear ВК я положу
CGPoint p = [self.view convertpoint:CGPointMake(500*self.scrollView.zoomScale, 200*self.scrollView.zoomScale) fromView:self.scrollView];
self.bubbleView.center = p;
Предполагая, что я начинаю с zoomScale 1.0f, когда происходит viewDidLoad, это будет соответствовать точке (500, 200) в scrollView.
Теперь мы просто хотим сохранить эту взаимосвязь между центральным положением пузырькового представления при прокрутке.
- (void)scrollviewDidScroll:(UIScrollView *)scrollView
{
CGPoint p = [self.view convertpoint:CGPointMake(500*self.scrollView.zoomScale, 200*self.scrollView.zoomScale) fromView:self.scrollView];
self.bubbleView.center = p;
}
Вы можете попробовать что-то вроде этого:
Подпишитесь как наблюдатель для contentSize scrollView (в вашем методе init, или viewDidLoad
в зависимости от настроек вашего проекта)
[self.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionInitial context:nil];
Затем обновите кадр пузыря в observeValueForKeyPath
метод:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
CGRect bubbleFrame = self.bubble.frame;
bubbleFrame.origin.y += self.scrollView.contentOffset.y;
bubbleFrame.origin.x += self.scrollView.contentOffset.x;
[self.bubble setFrame:bubbleFrame];
}
И не забудьте убрать наблюдателя:
- (void)dealloc {
[self.scrollView removeObserver:self forKeyPath:@"contentSize"];
}
Это должно заставить пузырь продолжать указывать в том же месте, что и прокрутка.
Дайте мне знать, если это сработало!