我有如下所示的要求,在下面的可缩放+可拖动图片上显示“对话泡泡”。
语音气泡不应该是可调整大小或可拖动的,并且在下面的图像调整大小或拖动时应该指向正确的位置。
我最初可以将讲话泡泡放在正确的位置。但是在拖动或缩放时我无法让它保持在正确的位置。
我尝试过在“scrollviewenddragging”等过程中进行计算并将其放置在正确的位置,但没有什么工作完美。我看到的一个主要问题是浮动视图位置在“scrollviewdidscroll”的第二次传递期间“重置”到故事板x,y位置。
处理此问题的最佳方法是什么。有什么指针吗?
答案 0 :(得分:0)
您可以尝试这样的事情:
将自己订阅为scrollView的contentSize的观察者(在您的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"];
}
这会使气泡在滚动时保持指向同一个位置。
让我知道它是否成功了!
答案 1 :(得分:0)
好的,有多种方法可以做到这一点。 (1)您可以将气泡视图添加到滚动视图中。它的位置将保持锚定状态,但在进行缩放时需要调整大小。在scrollView委托方法中执行此操作 - 发生缩放时scrollViewDidZoom。 (2)您可以不将其添加到scrollView,而是将其添加到您的ViewController视图中(在将scrollView添加到VC的视图之后)。然后你不需要调整气泡视图的大小,但是你需要在滚动发生时在scrollView委托 - scrollViewDidScroll方法中重新定位它。
无论哪种方式,scrollView.zoomScale属性都是指向气泡视图的新大小或位置的链接。
我将描述上面的方法2。首先在VC的视图中定位气泡视图。确定气泡视图的锚点,即您希望将其放置在与scrollView相关的位置。我将从scrollView中的一个点选择一个点(对于气泡视图的中心),比如说(500,200)并将其映射到我VC视图中的一个点。
所以在VC的viewWillAppear方法中,我会把
CGPoint p = [self.view convertpoint:CGPointMake(500*self.scrollView.zoomScale, 200*self.scrollView.zoomScale) fromView:self.scrollView];
self.bubbleView.center = p;
假设我在viewDidLoad发生时使用zoomScale 1.0f开始,这将对应于scrollView中的点(500,200)。
现在我们只想在滚动时保持泡泡视图中心位置之间的关系。
- (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;
}