【问题标题】:How to implement my own zooming but still have access to the UIScrollView's scrolling?如何实现我自己的缩放但仍然可以访问 ScrollView 滚动?
【发布时间】:2009-01-29 20:17:52
【问题描述】:

我想使用 UIScrollView 的滚动/平移功能,但我想自己处理所有缩放和缩放。我目前的计划是拥有一个拥有多个 UIView 和 UIScrollView 作为子项的 UIView(我称之为 view1)的 viewController。

view1 是否可以处理所有多点触控事件(以便手动呈现其所有孩子的缩放状态)并将结果绘制到每个相应的滚动视图上以允许用户滚动结果?

(出于好奇,应用程序正在绘制多个热图,每个热图都有自己的一组轴。在缩放或滚动时,轴需要更新自身以正确标记数据区域(滚动视图)中表示的范围。我不能使用scrollView免费提供的默认上下文图像缩放缩放的原因是在上下文缩放上绘制的任何东西(包括参考线之类的东西)。缩放动作实际上并不是让事情变得更大,而是调整可视数据范围。)

【问题讨论】:

    标签: iphone objective-c zooming


    【解决方案1】:

    您确实可以让主托管视图拦截多点触控事件并以编程方式缩放底层 UIView。这就是我在my application 的OpenGL 显示部分所做的事情(源代码here)。您仍然可以将单点触摸事件传递给底层滚动视图以进行平移等。

    但是,仍然可能有一种方法可以在不拦截触摸事件的情况下执行您所描述的操作。 UIScrollView 通过对内容视图应用转换来进行默认缩放。作为对this question 的回应,我描述了一种在捏缩放完成后以新比例重新渲染内容视图的方法。这可以让您在缩放完成后用清晰的网格线刷新您的绘图。

    此外,如果您没有真正进行缩放并且您想通过捏缩放更改视图的另一个属性,您可以执行我在该问题中描述的操作并截取您的 contentView 上的转换设置,只是不要' t 应用变换。您可以从该转换中提取 UIScrollView 想要设置的比例,然后对视图进行自定义重绘作为响应。

    【讨论】:

      【解决方案2】:

      感谢您的建议布拉德。我最终使用的解决方案是扩展 UIScrollView 并使用以下方法覆盖 touchesMoved:withEvent: 方法:

      -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
      {
          if ([[event touchesForView:self] count] == 1) 
               [super touchesMoved:touches withEvent:event];
          [content touchesMoved:touches withEvent:event];
      }
      

      其中“内容”是指向我的滚动视图的内容子视图的指针。我必须这样做,因为我的内容需要缩放到点(即,用户手指下的数据空间中的点不应该改变)。发送给 setTransform: 的信息只能告诉我内容框架的大小,但我还需要其中的偏移量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-16
        • 1970-01-01
        • 1970-01-01
        • 2017-05-29
        • 1970-01-01
        • 2020-12-28
        • 1970-01-01
        相关资源
        最近更新 更多