【问题标题】: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 的当前部分的中心?

如何做到这一点?

【问题讨论】:

    标签: ios cocoa-touch uiscrollview


    【解决方案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: 方法并将我的代码放在那里。
    猜你喜欢
    • 1970-01-01
    • 2012-04-06
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多