滚动视图、缩放和缩放原点混淆
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:
方法并将我的代码放在那里。以上是关于滚动视图、缩放和缩放原点混淆的主要内容,如果未能解决你的问题,请参考以下文章