【问题标题】:Floating View inside scrollview jumps positions滚动视图内的浮动视图跳转位置
【发布时间】:2015-04-14 13:38:51
【问题描述】:

我有一个要求,如下所示,在下面的可缩放+可拖动图像上显示“语音气泡”。

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

我最初能够将对话气泡放置在正确的位置。但我无法让它在拖动或缩放时停留在正确的位置。

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

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

【问题讨论】:

  • 您是第一次使用自动布局来放置气泡吗?
  • 第一次隐藏,我猜是按照故事板 x,y 布置的。但是,当它变得可见时,我正在使用正确的 origin-x,y 值为其设置框架,然后显示它。

标签: ios uiview uiscrollview xcode-storyboard uiscrollviewdelegate


【解决方案1】:

你可以试试这样的:

以观察者的身份订阅 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"];
}

这应该使气泡在滚动时始终指向同一位置。

如果成功了请告诉我!

【讨论】:

  • 试过了。没有运气。同样的问题,当识别到缩放或拖动时,浮动视图会跳回情节提要位置。这类似于在缩放处理程序或拖动处理程序中处理的行为
【解决方案2】:

好的,有不止一种方法可以做到这一点。 (1) 您可以将气泡视图添加到滚动视图中。它的位置将保持锚定,但在发生缩放时需要调整大小。在 scrollView 委托方法中执行此操作 - scrollViewDidZoom 发生缩放时。 (2) 您可以将其添加到 scrollView 中,而是将其添加到您的 ViewController 的视图中(在 scrollView 被添加到 VC 的视图之后)。然后你不需要调整气泡视图的大小,但你需要在滚动视图委托中重新定位它 - 滚动发生时的 scrollViewDidScroll 方法。

无论哪种方式,scrollView.zoomScale 属性都是指向气泡视图的新大小或位置的链接。

我将在上面描述方法 2。首先将气泡视图定位在 VC 的视图中。确定气泡视图的锚点,即相对于滚动视图放置它的位置。我将从滚动视图中的一个点(例如 (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;
}

【讨论】:

  • 顺便说一句,为了让它看起来很好,您需要将气泡顶点映射并跟踪到滚动视图中的一个点,而不是气泡视图的自然中心。为此,您可以更改它的图层锚点,以便顶点成为新的中心。从你的照片看,它看起来像 'code' self.bubbleView.layer.anchorPoint = CGPointMake(0.25, 1.0) 'code'
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2016-11-02
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
相关资源
最近更新 更多