滚动视图内的浮动视图跳转位置

时间:2015-04-14 13:38:52

标签: ios uiview uiscrollview xcode-storyboard uiscrollviewdelegate

我有如下所示的要求,在下面的可缩放+可拖动图片上显示“对话泡泡”。

语音气泡不应该是可调整大小或可拖动的,并且在下面的图像调整大小或拖动时应该指向正确的位置。

我最初可以将讲话泡泡放在正确的位置。但是在拖动或缩放时我无法让它保持在正确的位置。

我尝试过在“scrollviewenddragging”等过程中进行计算并将其放置在正确的位置,但没有什么工作完美。我看到的一个主要问题是浮动视图位置在“scrollviewdidscroll”的第二次传递期间“重置”到故事板x,y位置。

enter image description here

处理此问题的最佳方法是什么。有什么指针吗?

2 个答案:

答案 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;
}