滚动视图、缩放和缩放原点混淆

Posted

技术标签:

【中文标题】滚动视图、缩放和缩放原点混淆【英文标题】:Scroll Views, Zooming and Zoom Origin Confusion 【发布时间】:2012-01-10 17:17:26 【问题描述】:

我已经阅读了相当多的文档,我必须说,我很困惑。这是我目前的设置。

在一个 iPad 项目中,我有一个 UIScrollView (scrollView),其中包含一个子 UIView (insetView)。我的insetView 是从scrollViewDidEndZooming 方法返回的,并且严格用于缩放它的子视图。

insetView 开始时小于scrollView 并以scrollView 为中心。当用户捏合缩放时,insetView 可以增长到原始大小的两倍,也可以缩小到原始大小的一半。

所有这一切都很好,但我想减轻一点烦恼。如果我捏缩放,insetView 会缩小,但缩放的原点是insetView 的左上角。换句话说,insetView 将在其左上角固定在scrollView 窗口中的同时增长和缩小。

我想做的是让insetView 放大和缩小它的中心,并固定在scrollView 的中心,直到它的大小大于scrollView 区域。那时,我希望缩放原点位于夹点的中间,或者至少位于当前可见的insetView 的当前部分的中心?

如何做到这一点?

【问题讨论】:

【参考方案1】:

你想在你的 scrollViewDidZoom: 委托方法中做这样的事情:

CGSize boundsSize = scrollView.bounds.size;
CGRect frameToCenter = insetView.frame;

if (frameToCenter.size.width < boundsSize.width) 
    frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2.0f;
 else 
    frameToCenter.origin.x = 0.0f;


if (frameToCenter.size.height < boundsSize.height) 
    frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2.0f;
 else 
    frameToCenter.origin.y = 0.0f;


insetView.frame = frameToCenter;

【讨论】:

如果我的scrollView 与我的显示器大小不同,CGSize boundsSize = self.bounds.size; 行不应该读成CGSize boundsSize = scrollView.bounds.size;吗? 抱歉,应该的。我从我的一个项目中复制了代码并对其进行了编辑,但未能正确编辑该位。好眼力。它对你有用吗? 是的!谢谢!实际上,除了else 语句之外,我的代码中曾经有过这一点。那是我的代码正在做的事情的一个缺失部分,并且没有该代码的错误比上面概述的行为更令人讨厌。我将此标记为答案,但我还有一个问题。我的insetView 仍然固定在scrollView 的左上角,同时捏着。当我松开捏合时,显示器重新居中。有没有办法做到这一点,而缩放正在生效,还是我只需要忍受它?这行得通,但我很挑剔,喜欢应用抛光! :) 嗯,我记得 ios 5 是一个小问题,但我确实认为 scrollViewDidZoom: 在整个缩放过程​​中不断被调用,所以它起作用了。你能在缩放时检查它是否被调用? 也实现scrollViewDidZoom: 方法并将我的代码放在那里。

以上是关于滚动视图、缩放和缩放原点混淆的主要内容,如果未能解决你的问题,请参考以下文章

你如何动画滚动和原子缩放?

UIScrollView 缩小具有 -ve 原点的视图

Swift/Math - 缩放时保持原点

UIScrollView 直到缩放用户操作后才平移

为捏合手势设置 UIScrollView 的原点

仅在三个方向上缩放滚动视图